Laravel: 如何为注入的模型对象加载额外关联资源
问题原因
你第一种写法出错的核心逻辑问题:通过隐式模型注入得到的$myData本身已经是Laravel自动根据路由参数查询返回的Table0模型实例,你在实例上调用with()方法相当于重新初始化了一个新的查询构造器,后续调用first()自然会返回整张表的第一条数据,完全没有用到已经注入完成的模型数据。
基于模型注入的实现方案
分两步完成配置即可:
1. 配置路由绑定的查询字段
因为你的业务逻辑是用key字段而非默认主键id做查询匹配,需要先指定路由绑定的字段,两种方案二选一即可:
- 方案一:在
Table0模型中重写getRouteKeyName方法,全局指定该模型的路由绑定字段
public function getRouteKeyName() { return 'key'; }
- 方案二:直接在路由定义中指定绑定字段,仅对当前路由生效
Route::get('/table0/{myData:key}', [Table0Controller::class, 'show']);
注意要保证路由参数名
myData和控制器方法的参数名$myData完全一致,否则隐式注入不会生效。
2. 修改控制器方法,为注入的模型加载关联
已经拿到模型实例后,使用load()方法做延迟预加载关联即可,不需要再调用查询构造器方法:
public function show(Table0 $myData) { // 支持一次传入多个关联名,不需要多次调用load方法 return $myData->load('additionalTable1', 'additionalTable2'); }
内容的提问来源于stack exchange,提问作者NDDT
相关产品推荐
相关产品推荐

