Laravel查询where条件失效问题:whereBetween与orWhereBetween联用异常
Laravel查询中where条件未生效的原因及解决办法
嘿,这个问题我太熟悉了——这是Laravel查询构造器里常见的逻辑优先级陷阱!
问题根源:逻辑运算符的优先级
你当前的查询代码翻译成SQL后,逻辑结构会变成这样:
SELECT * FROM programs WHERE id IN (?) AND shareable = '1' AND starting_date BETWEEN ? AND ? OR ending_date BETWEEN ? AND ?
在SQL语法里,AND的优先级比OR高,所以这条语句实际执行的逻辑是:(id IN (...) AND shareable='1' AND starting_date在区间内) OR ending_date在区间内。也就是说,只要满足ending_date的区间条件,不管id是否在指定列表里、shareable是否为1,都会被查询出来——这就是你感觉前面的where条件没生效的原因。
你真正想要的逻辑应该是:id IN (...) AND shareable='1' AND (starting_date在区间内 OR ending_date在区间内),需要把两个区间条件放在同一个逻辑分组里。
解决方案:用闭包分组条件
要实现正确的逻辑,你需要用闭包把whereBetween和orWhereBetween包裹起来,让它们成为一个整体的逻辑组。修正后的代码如下:
$childs = Program::whereIn('id', $programs_by_date) ->where('shareable', '=', '1') // 闭包会自动给内部条件添加括号,保证逻辑优先级正确 ->where(function($query) use ($new_start_date, $new_end_date) { $query->whereBetween('starting_date', [$new_start_date, $new_end_date]) ->orWhereBetween('ending_date', [$new_start_date, $new_end_date]); }) ->get();
这段代码生成的SQL会变成:
SELECT * FROM programs WHERE id IN (?) AND shareable = '1' AND (starting_date BETWEEN ? AND ? OR ending_date BETWEEN ? AND ?)
这样一来,前面的whereIn和where('shareable',1)会和括号内的“二选一区间条件”进行AND运算,只有同时满足前置过滤条件,且满足两个区间条件中的一个,数据才会被返回。
内容的提问来源于stack exchange,提问作者colombo
相关产品推荐
相关产品推荐

