如何在 Laravel Eloquent 中准确检测两个日期时间范围是否重叠
本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现纠正常见边界条件误判问题提供简洁可靠的数据库查询方案及完整代码示例。 本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现纠正常见边界条件误判问题提供简洁可靠的数据库查询方案及完整代码示例。在构建智能储物柜预约系统时精确检测时间范围重叠是防止重复预订的核心逻辑。你当前的查询仅分别比对起止日期和起止时间未将「日期时间」作为统一时间点处理导致跨时段重叠如 19:00–21:00 与 19:30–21:30被错误判定为无冲突——这正是典型的时间区间重叠判断逻辑缺陷。? 正确的重叠判断数学原理两个时间区间 [A, B]用户请求与 [Y, Z]已有预约存在重叠当且仅当A Z AND Y B即用户开始时间早于已有结束时间 且 已有开始时间早于用户结束时间。该条件覆盖全部四类重叠场景包含完全包含、部分交叉、首尾相接等且简洁高效无需 OR 多层嵌套。?? 推荐实现统一使用 datetime 字段 单条 WHERE 查询首先强烈建议将数据库字段从分离的 beginning_date/beginning_time 改为合并的 beginning_datetime 和 end_datetime类型为 DATETIME。这不仅简化逻辑、提升性能更避免时区与格式解析风险。// 在控制器中优化后public function create(Request $request){ $locationId $request-input(location_id); $duration (int) $request-input(duration); // ? 统一解析为 Carbon 实例推荐使用 ISO 格式避免解析歧义 $beginningDatetime Carbon::createFromFormat(Y-m-d H:i, $request-input(beginning_date) . . $request-input(beginning_time) ); $endDatetime $beginningDatetime-copy()-addHours($duration); // ? 核心重叠检测一行逻辑高可读、高可靠 $reservedCount Reservation::where(end_datetime, , $beginningDatetime) -where(beginning_datetime, , $endDatetime) -count(); $totalBoxes Box::where(location_id, $locationId)-count(); $available $totalBoxes $reservedCount; return view(checkout, compact( locationId, beginningDatetime, endDatetime, duration, available ));}?? 注意事项字段类型必须为 DATETIME 或 TIMESTAMP确保数据库能正确比较时间点使用 Carbon::createFromFormat() 显式指定输入格式避免 Carbon::parse() 因模糊格式如 06/04/2022引发地区差异addHours($duration) 前务必 copy() 原实例防止意外修改 $beginningDatetime若暂无法修改表结构需在查询中手动拼接日期时间字符串不推荐性能差且易出错-whereRaw(CONCAT(beginning_date, , beginning_time) ?, [$endDatetime-format(Y-m-d H:i:s)])-whereRaw(CONCAT(end_date, , end_time) ?, [$beginningDatetime-format(Y-m-d H:i:s)])? 为什么你的原查询会失效你原逻辑 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2494349.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!