
本文介绍在 laravel 8 项目中,如何根据数据库中已存在的预约记录,动态禁用时间槽(radio button)表单控件,确保用户无法重复选择已被占用的时段。
本文介绍在 laravel 8 项目中,如何根据数据库中已存在的预约记录,动态禁用时间槽(radio button)表单控件,确保用户无法重复选择已被占用的时段。
在汽车清洗(Carwash)类预约系统中,常以单选按钮(<input type="radio">)呈现可用时间段(如 9:00、10:00、11:00 等)。为保障数据一致性与用户体验,必须实时禁用已被其他用户预订的时段。Laravel 8 提供了简洁高效的 Blade 模板语法,可结合后端查询结果实现条件渲染。
核心思路:在控制器中预先查询所有已被占用的时间段(例如从 bookings 表中获取 slot_time 列),将其转为集合或数组(如 $bookedSlots = Booking::pluck('slot_time')->toArray();),再在视图中遍历所有候选时段,对匹配项添加 disabled 属性。
示例代码如下(Blade 模板):
@foreach ($availableSlots as $slot)
<div class="form-check">
<input
type="radio"
name="booking_slot"
id="slot_{{ $slot }}"
value="{{ $slot }}"
class="form-check-input"
{{ in_array($slot, $bookedSlots) ? 'disabled' : '' }}
>
<label class="form-check-label" for="slot_{{ $slot }}">
{{ \Carbon\Carbon::parse($slot)->format('g:i A') }}
</label>
@if(in_array($slot, $bookedSlots))
<span class="text-muted ms-2 small">(已预约)</span>
@endif
</div>
@endforeach⚠️ 注意事项:
- 确保 $bookedSlots 数组中的时间格式与 $availableSlots 中完全一致(建议统一使用 H:i 格式存储并比对);
- 为提升性能,避免在循环内执行数据库查询,所有预订状态应在控制器层一次性查出;
- 建议配合前端 JS 做二次校验(如提交时检查是否仍有效),但服务端必须做最终验证(禁用仅是 UI 提示,不可替代逻辑校验);
- 若使用 Eloquent 关系或复杂查询(如按日期+服务类型过滤),可在控制器中通过 whereDate() 和 whereIn() 精确筛选当日已占时段。
通过该方式,既能保持界面清晰友好,又能从逻辑层面防止冲突预订,是 Laravel 预约类应用中推荐的标准实践。

















