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

Laravel9如何禁用数据库中存在10次记录的特定日期?

解决方案:实现预约日期上限禁用功能

1. 后端获取已达预约上限的日期

在Laravel控制器中,先查询Reservation表,筛选出预约记录数≥10的日期,传递给视图:

// 控制器对应的创建预约方法
public function create()
{
    // 按日期分组,提取已达10条预约的日期,格式统一为Y-m-d
    $blockedDates = Reservation::selectRaw('DATE(reservation_date) as date')
        ->groupBy('date')
        ->havingRaw('COUNT(*) >= 10')
        ->pluck('date')
        ->toArray();

    return view('reservations.create', compact('blockedDates'));
}

2. 视图层传递数据到前端

在Blade视图里,把后端的禁用日期数组转为JSON格式,供JavaScript使用:

<!-- 预约日期选择输入框 -->
<input type="text" id="reservation_date" name="reservation_date">

<script>
// 转成Set提升查询效率,避免数组includes的性能损耗
const blockedDates = new Set(@json($blockedDates));
</script>

3. 完善jQuery Datepicker的禁用逻辑

修改datepicker的beforeShowDay回调,判断当前日期是否在禁用列表中:

$(function() {
    $("#reservation_date").datepicker({
        dateFormat: "yy-mm-dd", // 和后端日期格式严格保持一致
        beforeShowDay: function(date) {
            // 将Date对象转为统一格式的字符串
            const formattedDate = $.datepicker.formatDate("yy-mm-dd", date);
            // 返回[是否可用, 样式类名, 悬停提示文本]
            return [!blockedDates.has(formattedDate), "", blockedDates.has(formattedDate) ? "该日期预约已满" : ""];
        },
        minDate: 0 // 可选:禁用过去的日期,根据需求调整
    });
});

关键注意事项

  • 日期格式统一:后端查询的日期格式和前端datepicker的输出格式必须完全一致,否则判断会失效。
  • 后端二次验证:前端禁用只是用户体验优化,必须在提交预约时再次校验,防止恶意绕过前端限制:
// 预约提交的控制器方法
public function store(Request $request)
{
    $request->validate([
        'reservation_date' => 'required|date',
        // 其他字段验证规则
    ]);

    // 再次校验该日期的预约数量
    $reservationCount = Reservation::whereDate('reservation_date', $request->reservation_date)->count();
    if ($reservationCount >= 10) {
        return back()->withErrors(['reservation_date' => '该日期预约已满']);
    }

    // 创建预约记录
    Reservation::create($request->all());

    return redirect()->route('reservations.index')->with('success', '预约成功');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:37:55