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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:14:17