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

如何用Laravel 5查询构造器实现带复杂ON条件的LEFT JOIN

嘿,这个场景我之前做项目时刚好遇到过,Laravel的查询构造器完全能搞定这种带混合逻辑的JOIN ON条件,咱们直接上代码和解释:

实现步骤

首先明确你要生成的目标SQL:

select * from table LEFT JOIN table_b ON `condition1` AND (`condition2` OR `condition3`)

对应的Laravel查询构造器代码可以这么写:

use Illuminate\Support\Facades\DB;

$results = DB::table('table')
    ->leftJoin('table_b', function ($join) {
        // 先写第一个AND的基础关联条件(替换成你的实际condition1)
        $join->on('table.id', '=', 'table_b.table_id')
             // 用闭包包裹OR条件组,Laravel会自动帮你加上括号
             ->where(function ($subQuery) {
                 // 替换成你的condition2和condition3
                 $subQuery->where('table_b.status', '=', 1)
                          ->orWhere('table_b.is_active', '=', true);
             });
    })
    ->select('*')
    ->get();

关键细节说明

  • 把leftJoin的第二个参数换成闭包,就能自由构建复杂的ON关联逻辑
  • 外层的$join->on()对应你SQL里的第一个AND条件
  • 嵌套的where()闭包用来包裹OR条件组,Laravel会自动给这个闭包内的条件加上括号,完美复现你要的(condition2 OR condition3)结构
  • 如果你的OR条件是字段和字段之间的比较(而非字段和固定值),可以把where()和orWhere()换成on()和orOn(),比如:
$subQuery->on('table_b.col_a', '=', 'table.col_x')
         ->orOn('table_b.col_b', '=', 'table.col_y');

验证生成的SQL

如果你想确认生成的SQL是否符合预期,可以用toSql()方法输出SQL语句(不会执行查询):

$sql = DB::table('table')
    ->leftJoin('table_b', function ($join) {
        $join->on('table.id', '=', 'table_b.table_id')
             ->where(function ($subQuery) {
                 $subQuery->where('table_b.status', '=', 1)
                          ->orWhere('table_b.is_active', '=', true);
             });
    })
    ->select('*')
    ->toSql();

echo $sql;

输出的SQL会是:

select * from `table` left join `table_b` on `table`.`id` = `table_b`.`table_id` and (`table_b`.`status` = ? or `table_b`.`is_active` = ?)

完全匹配你要的结构~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:32:35