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

Laravel中如何验证同一日期内id_room不可重复预订

问题分析与解决方案

你的验证逻辑失效的核心原因是闭包内的return语句打断了后续代码执行:在where闭包里,你写了return $startDate = date('Y-m-d');,这会直接返回赋值后的日期字符串,后面获取酒店ID、拼接查询条件的代码根本没机会运行,导致unique规则的额外条件完全没生效。

修正后的验证代码

$request->validate([
    'id_room' => [
        'required', 
        'integer', 
        Rule::unique('books')->where(function ($query) use ($request) {
            $startDate = date('Y-m-d');
            $hotelId = Auth::user()->id_hotel;
            // 移除多余的前置return,直接拼接并返回查询条件
            return $query->where('id_room', $request->id_room)
                        ->whereDate('book_date', $startDate)
                        ->where('id_hotel', $hotelId);
        })
    ],
    'guestname' => ['required', 'string', 'max:255'],
    'nik' => ['required', 'string', 'max:255'],
    'nota' => ['required', 'string', 'max:255'],
    'price' => ['required', 'integer'],
]);

并发场景下的额外保障

因为有两名接待员同时操作,仅靠请求层面的验证可能存在竞态条件(比如两个请求同时通过验证,随后同时插入重复数据)。必须在数据库层面加唯一索引彻底规避:

  1. 创建迁移文件:
Schema::table('books', function (Blueprint $table) {
    $table->unique(['id_room', 'book_date', 'id_hotel']);
});
  1. 执行迁移命令:php artisan migrate

这样即使验证环节出现并发漏洞,数据库会直接拒绝重复插入操作,从根源确保数据唯一性。

内容的提问来源于stack exchange,提问作者Yudha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:55:16