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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:36:06