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

如何在Laravel的Eloquent中关联子查询结果?

用Eloquent实现带子查询的JOIN查询

当然可以用Eloquent实现这个需求!Laravel的Query Builder提供了非常灵活的方法来构建这类包含子查询的关联查询,我来一步步给你拆解具体写法:

第一步:构建子查询

先把你SQL里的子查询部分转换成Eloquent的Query Builder实例:

// 对应原生SQL里的 (SELECT cat_id FROM TABLE2 where brand_id = 2 GROUP BY TABLE2.cat_id) AS b
$subquery = DB::table('TABLE2')
    ->select('cat_id')
    ->where('brand_id', 2)
    ->groupBy('cat_id');

第二步:主查询关联子查询

用joinSub方法把主表和子查询关联起来,这个方法专门用来处理子查询作为JOIN表的场景:

// 对应原生SQL的 SELECT * FROM TABLE1 JOIN ... ON TABLE1.id = b.cat_id
$result = DB::table('TABLE1')
    ->joinSub($subquery, 'b', function ($join) {
        $join->on('TABLE1.id', '=', 'b.cat_id');
    })
    ->get();

用模型写法(可选)

如果你的TABLE1对应有Eloquent模型(比如命名为Table1),也可以直接通过模型来构建查询,写法更贴合ORM的使用习惯:

$result = Table1::query()
    ->joinSub($subquery, 'b', function ($join) {
        // 注意这里如果模型设置了表名前缀或者自定义表名,要对应调整字段的表名部分
        $join->on('table1.id', '=', 'b.cat_id');
    })
    ->get();

补充说明

joinSub方法的三个核心参数:

  • 第一个参数:子查询的Query Builder实例
  • 第二个参数:子查询的别名(就是你SQL里的b)
  • 第三个参数:闭包函数,用来定义JOIN的关联条件,和原生SQL里的ON语句完全对应

如果后续需要扩展关联条件,还可以在闭包里添加onWhere等方法来实现更复杂的逻辑哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:26:41