Laravel Nova的fields函数中如何访问当前$model实例
Laravel Nova 资源fields方法访问当前操作模型的实现方式
在Nova资源的fields方法里不需要额外注入参数,直接从传入的NovaRequest实例就能解析到当前操作的模型,你之前用$request->user()拿ID逻辑错误的核心原因是,这个方法永远返回当前登录的后台操作账号,和你正在编辑/查看的目标资源没有关联。
正确实现代码
直接调用请求实例的findResourceOrFail()方法解析当前访问的Nova资源,再取其绑定的模型实例即可,注意要兼容创建新资源的场景(此时还没有持久化的模型数据):
public function fields(NovaRequest $request) { // 拿到当前访问的Nova资源对应的模型实例 $currentModel = $request->findResourceOrFail()->model(); // 仅当模型已持久化、且关联用户ID存在时,校验IBAN绑定状态 $isIbanBinded = $currentModel->exists && $currentModel->id_user && IBAN::where('user_id', $currentModel->id_user)->whereNotNull('iban')->exists(); if ($isIbanBinded) { return [ // IBAN已绑定时返回的字段集合 ]; } return [ Text::make("IBAN:", 'iban') ->required() ->rules('required') ->placeholder("PT000000"), ]; }
注意事项
- 必须加
$currentModel->exists判断:新建资源的场景下,解析出来的是未入库的空模型,没有主键和关联数据,跳过判断直接查IBAN会触发空ID查询报错 - 如果你是从用户详情页通过关联入口新建IBAN资源,此时新模型还没有写入
id_user值,可以补充从路由参数取关联ID:$userId = $currentModel->id_user ?: ($request->viaResource === 'users' ? $request->viaResourceId : null),覆盖关联新建的场景 - 原逻辑里
IBAN::find($model->id_user)的写法有隐患:find默认按模型主键查询,如果IBAN表的主键不是user_id会查错数据,直接用where条件判断IBAN是否存在更稳妥,也能避免关联数据缺失时抛出模型不存在异常 - 不要尝试在
fields方法里用全局辅助函数或者容器拿模型,不同访问场景(列表、详情、编辑、关联)下全局容器里绑定的模型实例不稳定,从请求对象解析是官方兼容的标准写法
内容的提问来源于stack exchange,提问作者daviddiniss
相关产品推荐
相关产品推荐

