Laravel中如何在Left Join内编写嵌套Join关联查询
Laravel 多表嵌套左连接正确实现
错误说明
原有写法的问题在于:leftJoin 方法传入的闭包仅用于定义当前连接表和主表的ON关联条件,不支持直接在闭包内追加其他关联表的JOIN逻辑。目标SQL的逻辑是将orders、factories、setup三表内连接的结果集作为临时表,和主表po做左连接,这类场景需要使用子查询连接方法实现。
正确实现代码
// 第一步:构造三表内连接的子查询 $nestedJoinSub = DB::table('orders AS xo') ->join('factories AS xs', 'xs.factory_id', '=', 'xo.factory_id') ->join('setup AS sp', 'sp.factory_id', '=', 'xs.legacy_factory_id') ->select([ // 必须包含关联用的字段 'xo.production_id', // 此处按需添加你需要查询的xo、xs、sp表的其他字段 ]); // 第二步:将子查询作为左连接的临时表关联主表 $finalQuery = DB::table('你的主表名 AS po') // 替换为实际使用的主表,例如productions AS po ->leftJoinSub($nestedJoinSub, 'xo', function ($join) { $join->on('xo.production_id', '=', 'po.production_id'); }) // 后续select、where、groupBy等查询逻辑正常追加即可 ->get();
注意事项
- 子查询的select语句中必须包含关联用到的
production_id字段,否则关联时会抛出字段不存在的错误 - 如果需要根据传入参数给子查询加过滤条件,直接在构造
$nestedJoinSub的时候追加where条件即可
内容的提问来源于stack exchange,提问作者Jitesh
相关产品推荐
相关产品推荐

