Custom validation rule:校验房屋预订日期范围是否已占用的Eloquent查询
房屋租赁预订日期冲突校验Eloquent实现方案
核心冲突判断逻辑
首先明确两个预订时间段冲突的所有场景,只要满足以下规则就属于日期占用:
- 新预订的开始时间 早于 已有预订的结束时间 且 新预订的结束时间 晚于 已有预订的开始时间
该判断可以覆盖所有重叠场景:完全包含、部分重叠、首尾部分重合等。
Eloquent查询代码实现
假设你的预订模型为Booking,表单提交的入住日期变量为$inputStart(对应表字段started_at)、退房日期变量为$inputEnd(对应表字段ends_at),校验查询代码如下:
// $houseId为当前待预订的房屋ID $isDateOccupied = Booking::where('house_id', $houseId) ->where(function ($query) use ($inputStart, $inputEnd) { // 核心冲突判断条件 $query->where('started_at', '<', $inputEnd) ->where('ends_at', '>', $inputStart); }) ->exists(); if ($isDateOccupied) { // 存在日期冲突,返回错误提示 return back()->withErrors(['msg' => '所选入住/退房时间段已被预订,请调整日期后重试']); } // 无冲突,继续执行新增预订逻辑
边界场景适配
如果你的业务允许前一单退房当日允许新单入住(比如已有9月23日-9月28日的预订,允许新预订9月28日入住),可以调整运算符适配规则:
- 把
where('started_at', '<', $inputEnd)修改为where('started_at', '<=', $inputEnd) - 把
where('ends_at', '>', $inputStart)修改为where('ends_at', '>=', $inputStart)
内容的提问来源于stack exchange,提问作者Kylian
相关产品推荐
相关产品推荐

