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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:57:25