Laravel 中如何实现带IS NULL条件的Join关联查询
解决方案
你原写法的问题在于:多次调用$join->on()默认会用AND连接多个条件,和你需要的OR逻辑不符,同时IS NULL是特殊的判断语法,不能直接用普通的on二元运算符写法。
正确的写法有两种:
写法1(推荐,可读性更高)
直接在join闭包中使用orWhereNull方法:
$query = Table1::join('table2', function($join){ $join->on('table1.col1', '=', 'table2.col1') ->orWhereNull('table1.col2'); });
写法2(用on方法实现)
如果要统一用on方法编写,可以搭配DB::raw处理NULL关键字:
$query = Table1::join('table2', function($join){ $join->on('table1.col1', '=', 'table2.col1') ->orOn('table1.col2', 'is', \DB::raw('NULL')); });
如果你的JOIN还有其他额外的关联条件,为了避免逻辑优先级混乱,可以把这组OR条件包裹在闭包里:
$query = Table1::join('table2', function($join){ $join->where(function ($query) { $query->on('table1.col1', '=', 'table2.col1') ->orWhereNull('table1.col2'); }); // 此处可继续添加其他AND连接的JOIN条件,不会干扰上方OR组的逻辑 });
内容的提问来源于stack exchange,提问作者Bvc...
相关产品推荐
相关产品推荐

