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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.15 16:15:59