Laravel中leftJoin同时使用on和orOn时如何给OR条件加括号
解决方案
你需要将OR关联的两个条件包裹在on方法的闭包参数内,Laravel查询构造器会自动为这部分条件加上括号,正确写法如下:
TABLE1::leftJoin('table2', function($join){ // 闭包内的条件会被自动包裹在括号中 $join->on(function($query) { $query->on('table1.id', '=', 'table2.id') ->orOn('table1.tid', '=', 'table2.tid'); })->on('table1.x', '=', 'table2.x'); })->get();
原理解释
你之前的写法生成的JOIN条件为:
table1.id = table2.id OR table1.tid = table2.tid AND table1.x = table2.x
由于SQL语法中AND的运算优先级高于OR,实际执行逻辑和你预期的括号逻辑完全不符。
使用闭包包裹OR条件的写法,最终生成的JOIN条件就是你需要的:
(table1.id = table2.id OR table1.tid = table2.tid) AND table1.x = table2.x
逻辑完全符合要求。
内容的提问来源于stack exchange,提问作者Inigo EC
相关产品推荐
相关产品推荐

