Laravel 查询中处理可空结束日期的动态范围筛选
在Laravel中处理可空结束日期的动态范围筛选,需避免使用whereBetween或固定条件。正确做法是采用闭包条件化查询,利用或逻辑处理end_at为NULL的情况,避免NULL比较导致记录被过滤,实现半开放时间区间的准确查询。
本文讲解如何在 Lara vel 中正确构建查询条件,使记录满足“大于等于开始时间、且仅当结束时间存在时小于等于结束时间”的逻辑,避免因 end_at 为 NULL 导致查询失效。
聊一个业务里经常碰到的“小坑”——时间范围筛选,但结束日期偏偏是可空的。比如活动有效期、价格策略、权限有效期这类场景,通常会有个必填的start_at,和一个可选的end_at。如果end_at为空,表示长期有效;不为空,那就得严格落在 [start_at, end_at] 这个闭区间内。听起来简单,写查询的时候却容易翻车。
直接上 whereBetween()?不行,因为那个方法默认两端都得非空,给个null进去,SQL 直接报错或者出假结果。写两个where条件固定住?更糟——where('end_at', '>=', $effectiveDate) 碰上 end_at 是 NULL,SQL 里 NULL 跟任何值比较都返回 UNKNOWN,整行记录就被过滤掉了,那些本该长期有效的记录全没了。
正确做法是条件化查询,用闭包把“或”逻辑包装进去。看这段代码:
$effectiveDate = '2022-04-06 23:34:00';
GroupExtras::query()
->select('group_extras.*')
->join('groups', 'group_extras.group_id', '=', 'groups.id')
->where('group_extras.start_at', '<=', $effectiveDate)
->where(function ($query) use ($effectiveDate) {
// 分支一:end_at 为 NULL → 视为无限期,无需额外限制
$query->whereNull('group_extras.end_at')
// 分支二:end_at 非 NULL → 必须 >= effectiveDate
->orWhere(function ($sub) use ($effectiveDate) {
$sub->whereNotNull('group_extras.end_at')
->where('group_extras.end_at', '>=', $effectiveDate);
});
})
->orderBy('group_extras.value')
->first();
关键逻辑拆开看:
- 主条件
start_at <= $effectiveDate先把所有已生效的记录筛出来。 - 匿名闭包里面,用
whereNull()匹配无结束日期的行,再通过orWhere()嵌套一个子条件:只有那些有结束日期且还没过期的才保留。这样两个分支合并,正好覆盖“长期有效”和“有限期”两种场景。 - 切记不要在
where()里直接写end_at >= ?然后传 NULL,SQL 里 NULL 比较返回 UNKNOWN,行会被排除,这是最隐蔽的坑。
另外有几个小提醒:
- 别用
whereBetween('column', [$start, $end]),它底层生成BETWEEN $start AND $end,$end 是 null 时直接非法。 - 如果项目用的是 MySQL 5.7+ 严格模式,建议用 Carbon 把时间格式化成标准
Y-m-d H:i:s字符串,或者显式用DB::raw()处理,避免隐式转换出问题。 - 数据量大的表,记得在
start_at和end_at上建联合索引,比如INDEX(start_at, end_at),这个查询的效率会好很多。
这个方案写起来语义清晰,也兼容主流数据库,算是 Lara vel 里处理“半开放时间区间”的标准思路了。下次遇到类似需求,直接套用这个闭包模板就行,不用再纠结 NULL 导致的“幽灵过滤”。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。
CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。
Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。
Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。
CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。


























