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

Laravel集合无orWhereBetween/orWhere如何实现日期区间筛选

Laravel集合按起止日期筛选的正确写法

原有代码的问题

  • 基础语法错误:第二行endTime变量前缺少$符号,会直接抛出语法异常
  • 逻辑优先级错误:PHP中&&优先级高于||,未加括号明确分组时,条件判断顺序和预期不符
  • 覆盖场景不全:原有判断仅覆盖了条目开始/结束时间落在筛选区间内的场景,漏掉了条目时间完全包裹筛选区间的情况,且使用>/<比较会漏掉时间点刚好匹配筛选边界的数据
  • 类型风险:直接对未做类型转换的日期字段做比较,如果字段是字符串格式时间,隐式转换很容易出现对比错误

修正代码

$startTime = Carbon::parse($explodeComma[0]);
$endTime = Carbon::parse($explodeComma[1]);

$collection = $collection->filter(function ($item) use ($startTime, $endTime) {
    $itemStart = Carbon::parse(data_get($item, 'date_start'));
    $itemEnd = Carbon::parse(data_get($item, 'date_end'));
    
    // 两个时间区间存在交集的最简判断,用括号明确逻辑边界
    return $itemStart->lte($endTime) && $itemEnd->gte($startTime);
});

上述判断逻辑覆盖所有区间重叠场景:条目开始在筛选区间内、条目结束在筛选区间内、条目时间完全包裹筛选区间、条目时间完全被筛选区间包含,不需要拆分多个||条件。
如果你不需要匹配时间刚好相等的边界场景,把lte替换为lt、gte替换为gt即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:09:18