如何在Laravel中用Eloquent的whereHas实现三表关联查询并修复代码
修复三表关联查询的方法
第一步:确保模型关联正确定义
首先要在对应Eloquent模型中正确设置关联关系:
- C模型(对应Table C):定义与B模型的关联
// app/Models/C.php public function tableB() { return $this->hasMany(B::class, 'tableId_C'); }
- B模型(对应Table B):定义与A模型的关联
// app/Models/B.php public function tableA() { return $this->belongsTo(A::class, 'tableId_A'); }
第二步:修复查询代码
原代码的错误在于:在withWhereHas的闭包里错误调用了$query->tableB->where,正确的做法是通过嵌套whereHas关联到Table A的name字段。
修复后的代码:
$this->model->query() ->withWhereHas('tableB', function ($query) use ($names) { // 嵌套whereHas,通过tableB关联到tableA,匹配name字段 $query->whereHas('tableA', function ($subQuery) use ($names) { $subQuery->where('name', 'LIKE', "%{$names}%"); }); }) ->get(); // 按需添加get()或paginate()等获取结果的方法
代码说明
withWhereHas:同时实现预加载关联数据和筛选主模型数据的功能,等同于同时调用with()和whereHas()- 嵌套
whereHas('tableA'):通过B模型的关联关系,筛选出关联的A模型中name匹配关键词的记录,最终得到符合条件的C模型数据
如果不需要预加载关联数据,只需要筛选C模型,直接用whereHas即可:
$this->model->query() ->whereHas('tableB', function ($query) use ($names) { $query->whereHas('tableA', function ($subQuery) use ($names) { $subQuery->where('name', 'LIKE', "%{$names}%"); }); }) ->get();
内容的提问来源于stack exchange,提问作者Marc Jamal
相关产品推荐
相关产品推荐

