You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多态关联查询问题:无限循环与字段不存在报错

问题分析与解决方案

问题场景

现有三个多态关联表:

  • maintenance表:id、stock_SNW_issue_id
  • Obsolescence表:id、stock_SNW_issue_id
  • Staff_performance表:id、performance_id、performance_type

需求:根据$issueId获取maintenance表对应的id,并检查该id是否存在于Staff_performance表中。

当前代码出现两个问题:

  1. 执行时触发无限循环
  2. 提示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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:11:21