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

Laravel 按店铺营业星期生成日期范围内营业列表及报错处理

Laravel诊所营业日期生成功能的问题排查与修复

核心报错与代码缺陷梳理

  • 基础语法错误:代码中多处将赋值运算符=误写为减号-,比如$endOfYear - Carbon::now()->endOfYear()、'dt' = $dt,会直接触发PHP语法报错
  • 数据类型传递错误:查询得到的$operatingDays是包含模型对象的集合,直接将其作为参数拼接进modify()方法的时间字符串时,PHP会将集合强转为字符串,最终形成你看到的带数组内容的异常时间串,触发DateTime::modify解析失败
  • 业务逻辑缺陷:原getWorkDayInRange方法仅支持单营业日的逐周累加,无法匹配多营业日同时存在的场景(比如诊所同时开放周一、周三、周五)

修复后的完整可运行代码

首先修正控制器index方法的基础错误,提前提取纯营业日数组,避免传递模型对象:

public function index(){
    // 直接通过pluck提取营业日的星期字段,转成纯字符串数组
    $operatingDays = OperatingHour::where('clinic_open', true)->pluck('day')->toArray();

    $currentDate = Carbon::now();
    // 修正赋值符号错误
    $endOfYear = Carbon::now()->endOfYear();

    $dt = $this->getWorkDayInRange($operatingDays, $currentDate, $endOfYear);

    $data = [
        // 修正数组键值的赋值符号错误
        'dt' => $dt,
    ];

    return view('appointment', $data);
}

重写getWorkDayInRange方法,兼容多营业日匹配,避免字符串拼接解析的隐患:

public function getWorkDayInRange(array $workDays, Carbon $fromDate, Carbon $toDate){
    $dates = [];
    // 将遍历指针定位到起始日的零点,消除时间部分带来的边界匹配误差
    $cursor = $fromDate->copy()->startOfDay();

    // 逐天遍历从当前到年底的时间范围
    while ($cursor->lte($toDate)) {
        // 直接通过Carbon内置方法获取当天的英文星期名,和数据库存储的字段值做匹配
        if (in_array($cursor->englishDayOfWeek, $workDays)) {
            $dates[] = $cursor->toDateString();
        }
        // 遍历指针向后移动一天
        $cursor->addDay();
    }

    return $dates;
}

注意事项

  • 尽量直接传递Carbon对象做时间计算,不要提前将对象转成字符串再重新解析,能规避大量格式不匹配、时区解析的问题
  • 从当前到年底的时间范围最多365天,逐天遍历的性能开销完全可忽略,这种写法的可读性和边界容错性远高于复杂的字符串拼接时间计算

注:如果数据库存储的星期值和Carbon返回的英文星期名格式不一致(比如存的是Mon而不是Monday),只需要在匹配前统一转换格式即可,不需要改动核心遍历逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 20:54:01