Laravel Eloquent使用whereDate查询无法匹配跨期预订记录怎么办
问题原因
现有查询逻辑只能匹配完全落在你指定的$startDate和$endDate范围内的预订,自然会漏掉两类符合要求的记录:
- 预订开始时间早于2021-08-25,但结束时间在2021-08-25之后
- 预订结束时间晚于2021-09-01,但开始时间在2021-09-01之前
你提到的完整覆盖目标时间段的预订就属于这类漏匹配的情况。
调整方案
根据你的实际查询需求选择对应逻辑即可:
场景1:查询所有和8月25日-8月31日有重叠的预订(哪怕只占用其中1天)
判断时间段重叠的通用逻辑为:预订开始时间 <= 目标区间结束时间 且 预订结束时间 >= 目标区间开始时间,代码如下:
// 注意保持字段名一致,你文档中提到的结束字段为booking_end,示例代码中用的是reservation_end $targetStart = '2021-08-25'; $targetEnd = '2021-08-31'; Booking::select('id', 'name', 'reservation_begin', 'reservation_end') ->whereDate('reservation_begin', '<=', $targetEnd) ->whereDate('reservation_end', '>=', $targetStart) ->get();
如果你的时间字段包含时分秒,建议替换whereDate避免精度丢失:
Booking::select('id', 'name', 'reservation_begin', 'reservation_end') ->where('reservation_begin', '<=', $targetEnd . ' 23:59:59') ->where('reservation_end', '>=', $targetStart . ' 00:00:00') ->get();
场景2:查询完全覆盖8月25日-8月31日整个时间段的预订
如果只需要匹配你举例的这类完整覆盖目标区间的预订,逻辑调整为:预订开始时间 <= 目标区间开始时间 且 预订结束时间 >= 目标区间结束时间,代码如下:
$targetStart = '2021-08-25'; $targetEnd = '2021-08-31'; Booking::select('id', 'name', 'reservation_begin', 'reservation_end') ->whereDate('reservation_begin', '<=', $targetStart) ->whereDate('reservation_end', '>=', $targetEnd) ->get();
内容的提问来源于stack exchange,提问作者Sandro
相关产品推荐
相关产品推荐

