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
相关产品推荐
相关产品推荐

