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

如何使用Eloquent通过中间表关联查询案件对应的法官与证人数据

Eloquent 多表关联查询修正方案

当前关联定义存在几处错误,修正后即可实现和原生SQL一致的查询效果。

核心错误点

  • 模型类名不统一:关联定义中混用Cases_judges、Case_judge类名,会触发类找不到错误
  • 关联类型选择不当:cases和judges是通过中间表关联的多对多关系,使用belongsToMany比hasManyThrough更适配场景,且原hasManyThrough的外键参数顺序完全错误
  • 关联方法定义错误:Judges模型中定义了和自身同名的judges()关联,逻辑完全错误;中间表模型缺少和法官表的关联
  • 预加载缺失:控制器查询时未预加载法官关联,无法返回对应数据

修正后代码

模型定义

Cases 模型

// 关联中间表
public function caseJudges(){
  return $this->hasMany(CasesJudge::class,'case_id','id');
}

// 关联证人
public function witnesses(){
  return $this->hasMany(Witness::class,'case_id','id');
}

// 关联法官:多对多关联直接指定中间表、外键即可
public function judges(){
  return $this->belongsToMany(
    Judges::class,
    'cases_judges',
    'case_id',
    'judge_id'
  );
}

Judges 模型

// 反向关联案件
public function cases(){
  return $this->belongsToMany(
    Cases::class,
    'cases_judges',
    'judge_id',
    'case_id'
  );
}

CasesJudge(原Cases_judges)中间表模型

public function case(){
  return $this->belongsTo(Cases::class, 'case_id', 'id');
}

public function judge(){
  return $this->belongsTo(Judges::class, 'judge_id', 'id');
}

控制器查询

public function index()
{
  // 一次性预加载法官、证人关联,返回结构和原生查询一致
  return Cases::with('judges', 'witnesses')->get();
}

hasManyThrough 实现方式(可选)

如果坚持使用hasManyThrough,按正确参数顺序定义即可:

public function judges(){
  return $this->hasManyThrough(
    Judges::class,
    CasesJudge::class,
    'case_id',
    'id',
    'id',
    'judge_id'
  );
}

该方式返回数据结构和belongsToMany略有差异,多对多场景下优先选择belongsToMany实现。

内容的提问来源于stack exchange,提问作者Eaimie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:21:30