Laravel Eloquent嵌套OR条件的Between查询语法疑问
解决Laravel查询构造器中嵌套OR条件的问题
我来帮你搞定这个嵌套OR条件的查询问题!你要实现的是AND (tableC.numberMin BETWEEN a1 AND a2 OR tableC.numberMax BETWEEN a1 AND a2)的逻辑,原代码里有几个小问题导致无法正常运行,我来一一修正:
原代码的问题点
- 嵌套闭包的参数错误:Laravel的
where闭包只接受查询构造器实例作为参数,外部变量$regFilterVal需要通过use()语法引入,而不是直接作为闭包参数传递 - 字段名重复:你第二个条件误写了
numberMin,应该是numberMax - 直接链式调用
orBetween会破坏逻辑:如果不用闭包包裹,orBetween会把前面所有的WHERE条件都变成OR关系,不符合你要的"AND 一组OR条件"的需求
正确的DB查询构造器写法
$result = DB::table('tableA') ->join('tableB', 'tableB.id', '=', 'tableA.tid') ->join('tableC', 'tableB.sd', '=', 'tableC.id') ->where('tableC.number', '=', '1') ->where('tableB.lang', '=', 'en') ->where(function ($q) use ($regFilterVal) { // 通过use引入外部变量 $q->whereBetween('tableC.numberMin', $regFilterVal) ->orWhereBetween('tableC.numberMax', $regFilterVal); // 修正为numberMax });
代码解释
这段代码会生成你需要的SQL逻辑:
SELECT * FROM `tableA` INNER JOIN `tableB` ON `tableB`.`id` = `tableA`.`tid` INNER JOIN `tableC` ON `tableB`.`sd` = `tableC`.`id` WHERE `tableC`.`number` = ? AND `tableB`.`lang` = ? AND (`tableC`.`numberMin` BETWEEN ? AND ? OR `tableC`.`numberMax` BETWEEN ? AND ?)
嵌套的where闭包会自动帮你把OR条件用括号包裹起来,确保这两个BETWEEN条件是一组,和前面的条件保持AND关系。
如果你用Eloquent模型的写法(可选)
如果你的项目中定义了对应的Eloquent模型(比如TableA),也可以这样写:
$result = TableA::join('tableB', 'tableB.id', '=', 'tableA.tid') ->join('tableC', 'tableB.sd', '=', 'tableC.id') ->where('tableC.number', 1) ->where('tableB.lang', 'en') ->where(function ($q) use ($regFilterVal) { $q->whereBetween('tableC.numberMin', $regFilterVal) ->orWhereBetween('tableC.numberMax', $regFilterVal); }) ->get();
内容的提问来源于stack exchange,提问作者Felipe Mora
相关产品推荐
相关产品推荐

