Laravel如何通过外键关联获取指定Penyedia下所有Pekerjaan数据
问题根因
现有代码存在3处错误,导致无法正确查询关联数据:
- 控制器查询逻辑错误:
showpekerjaan方法中调用Penyedia::with('pekerjaans')->get()会查询所有Penyedia数据及关联,并非当前指定ID的单个Penyedia下的关联数据,额外写的$pekerjaans查询完全冗余 - 路由模型绑定不匹配:跳转链接参数需要和路由、控制器方法参数名对齐,否则无法自动注入对应ID的Penyedia模型实例
- 视图传参变量不匹配:目标视图循环使用的变量是
$pekerjaan,但原控制器未传递对应名称的变量,会导致视图报错
修复方案
1. 修正路由定义
打开routes/web.php,确保对应路由参数名与控制器方法参数一致,触发Laravel隐式路由模型绑定:
Route::get('/nilaipekerjaan/{penyedia}', [AdminController::class, 'showpekerjaan']);
注意:路由参数必须命名为
{penyedia},和控制器方法中Penyedia $penyedia的变量名完全对应,否则绑定失效。
2. 修正控制器方法
将原showpekerjaan方法替换为如下代码,逻辑和你在Tinker中执行的操作完全一致:
//获取指定Penyedia对应的Pekerjaan数据 public function showpekerjaan(Penyedia $penyedia){ // 预加载当前Penyedia的关联Pekerjaan数据,避免N+1查询 $penyedia->load('pekerjaans'); // 取出关联数据赋值给视图需要的变量名 $pekerjaan = $penyedia->pekerjaans; return view('admin.tabelnilai_pekerjaan', compact('penyedia', 'pekerjaan')); }
原tabelnilai_penyedia方法逻辑正确,无需修改。
3. 视图可选优化
目标视图中企业名称列无需通过Pekerjaan模型反向查询关联,直接使用传入的$penyedia变量即可,减少冗余查询:
<td>{{$penyedia->nama}}</td>
其余视图代码无需调整,原有循环逻辑可正常渲染数据。
修复完成后,点击列表页的「Beri Penilaian」按钮,即可正确展示当前Penyedia下关联的所有Pekerjaan数据,效果和Tinker中查询结果完全一致。
内容的提问来源于stack exchange,提问作者YuPi
相关产品推荐
相关产品推荐

