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

Laravel中whereBetween查询不生效,请求技术排查

解决Laravel中whereBetween + orWhereBetween查询不生效的问题

看起来你的查询遇到了两个核心问题:SQL关键字冲突和查询逻辑未覆盖所有重叠场景,咱们一步步来搞定:

1. 先解决字段名解析错误的问题

from和to是SQL的保留关键字,直接作为字段名使用时,数据库会无法正确识别这是字段而非SQL语法,这会直接导致whereBetween条件失效。你需要用反引号(`)包裹这些字段名,明确告诉数据库这是字段。

在Laravel中可以通过DB::raw实现:

$fromdate = '2018-04-09';
$todate = '2018-04-28';

return DB::table('leaves')
    ->select('leaveId')
    ->whereBetween(DB::raw('`from`'), [$fromdate, $todate])
    ->orWhereBetween(DB::raw('`to`'), [$fromdate, $todate])
    ->get();

2. 覆盖所有请假与查询区间重叠的场景

你的现有查询只能筛选出「请假开始日期在区间内」或「请假结束日期在区间内」的记录,但还有一种常见场景:请假区间完全包含了你的查询区间(比如请假是2018-03-29到2018-04-28,而你的查询区间是2018-04-09到2018-04-21),这种情况也应该被纳入结果。

如果需要覆盖所有重叠场景,调整查询逻辑为分组判断:

$fromdate = '2018-04-09';
$todate = '2018-04-28';

return DB::table('leaves')
    ->select('leaveId')
    ->where(function ($query) use ($fromdate, $todate) {
        // 请假开始在查询区间内
        $query->whereBetween(DB::raw('`from`'), [$fromdate, $todate])
              // 请假结束在查询区间内
              ->orWhereBetween(DB::raw('`to`'), [$fromdate, $todate])
              // 请假区间完全包含查询区间
              ->orWhere(function ($subQuery) use ($fromdate, $todate) {
                  $subQuery->where(DB::raw('`from`'), '<=', $fromdate)
                           ->where(DB::raw('`to`'), '>=', $todate);
              });
    })
    ->get();

验证测试数据

拿你提供的第一条数据leaveId=11来说,它的to日期是2018-04-21,完全在你的查询区间内,用修正后的第一个查询就能正常获取到这条记录。

如果后续需要添加其他过滤条件,一定要把这些区间判断放在同一个where闭包内,避免or条件破坏其他查询逻辑。

内容的提问来源于stack exchange,提问作者max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:09:16