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

