Laravel中如何在foreach循环执行查询校验预约时段容量
可预约时段容量校验实现方案
问题根源
原有代码存在两个核心错误:
- 查询可预约时段配置时,仅读取了容量字段,最终拿到的结构为
[{"capacity":2},{"capacity":4}],没有同步查询容量对应的时段标识,根本无法判断哪个容量对应哪个时段,自然没法完成单时段的容量匹配 having条件直接拼接整个容量集合对象,数据库无法识别PHP集合的结构,不能逐时段判断容量阈值,查询逻辑本身不成立
实现逻辑
逐时段校验容量的流程如下:
- 读取所有可预约时段的配置,以时段值为键存储对应容量,方便后续快速比对
- 统计选定日期下每个时段的已预约总次数
- 遍历所有时段配置,逐一比对已预约次数和容量上限,达到上限的时段加入不可预约列表
代码示例
public function time(Request $request) { // 读取可预约时段配置,键为时段值,值为对应容量 // 注:如果你的avaliable_time表中时段字段名不是time,替换为实际字段名即可 $timeCapacityMap = AvaliableTime::pluck('capacity', 'time')->toArray(); // 统计选定日期各时段已预约数量 $reservedCountMap = Reservation::where('reservation_date', $request->query('date')) ->groupBy('reservation_time') ->selectRaw('reservation_time, count(*) as reserved_total') ->pluck('reserved_total', 'reservation_time') ->toArray(); $bannedTime = []; // 逐时段校验容量,达到上限则标记为不可预约 foreach ($timeCapacityMap as $time => $capacity) { $reservedCount = $reservedCountMap[$time] ?? 0; if ($reservedCount >= $capacity) { $bannedTime[] = $time; } } return view('public.time', [ "banned_time" => $bannedTime ]); }
补充说明
- 不要直接使用
$_GET取参,使用框架自带的Request对象获取请求参数可以自动完成参数过滤,规避SQL注入风险 - 如果可预约时段是按日期动态配置的,只需在查询
AvaliableTime时增加和预约日期对应的筛选条件即可 - 最终返回的
$bannedTime就是所有达到容量上限、需要从可选列表中排除的时段值数组
内容的提问来源于stack exchange,提问作者user17595824
相关产品推荐
相关产品推荐

