Laravel多态关联查询问题:无限循环与字段不存在报错
问题分析与解决方案
问题场景
现有三个多态关联表:
maintenance表:id、stock_SNW_issue_idObsolescence表:id、stock_SNW_issue_idStaff_performance表:id、performance_id、performance_type
需求:根据$issueId获取maintenance表对应的id,并检查该id是否存在于Staff_performance表中。
当前代码出现两个问题:
- 执行时触发无限循环
- 提示
performance_id列不存在
错误原因分析
1. performance_id列不存在的原因
控制器中使用whereHas('performance', ...)时,闭包内的$subQuery->where('performance_id', $bio_id)是对关联的maintenance表进行查询,但maintenance表并没有performance_id字段——这个字段实际属于Staff_performance表,因此触发字段不存在的错误。
2. 无限循环的原因
错误的whereHas用法导致Eloquent解析关联查询时逻辑混乱,加上可能的模型关联命名空间不匹配,引发循环查询。
修正后的代码方案
控制器函数修正
直接查询Staff_performance表的performance_id和performance_type字段即可,无需使用whereHas(多态关联的外键和类型字段本身就在Staff_performance表里):
public function isIssueAssigned($issueId) { // 获取maintenance表对应的id $bioId = bio_md_maintenance_dealer::where('stock_SNW_issue_id', $issueId)->value('id'); // 直接检查Staff_Performances中是否存在匹配的多态关联记录 $isAssigned = Staff_Performances::where([ 'performance_id' => $bioId, 'performance_type' => 'App\Models\Hospitals\MaintenanceReport\bio_md_maintenance_dealer' ])->exists(); return response()->json(['isAssigned' => $isAssigned]); }
可选优化:利用模型关联简化查询
从maintenance模型出发查询关联的staffPerformances,代码更简洁:
public function isIssueAssigned($issueId) { $maintenance = bio_md_maintenance_dealer::where('stock_SNW_issue_id', $issueId)->first(); $isAssigned = $maintenance ? $maintenance->staffPerformances()->exists() : false; return response()->json(['isAssigned' => $isAssigned]); }
额外注意事项
- 确认
Staff_Performances模型的命名空间和类名大小写正确(Laravel对模型类名大小写敏感) - 确保
maintenance模型的staffPerformances关联中,morphMany的第二个参数'performance'与Staff_Performances模型中morphTo的名称一致(当前代码已匹配,无需修改)
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

