如何使用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
相关产品推荐
相关产品推荐

