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

