能否在Laravel的::get查询中使用PHP date()将星期数字转为星期名称
你当前的实现方式不可行,原因如下:
- PHP 函数会在SQL查询发起前就执行完成,你直接把
date('l', strtotime('day_of_week'))写在查询字段参数里,PHP只会解析一次字符串'day_of_week',无法拿到数据库中每条记录的day_of_week字段值,最终只会返回固定的无效值,不会动态对应每条记录的星期数字。
推荐两种正确实现方案
方案1:用SQL原生函数在查询阶段处理(以MySQL为例)
使用selectRaw执行SQL原生的日期转换逻辑,直接返回格式化后的星期名称:
DeliveryOptions::selectRaw("DAYNAME(STR_TO_DATE(day_of_week, '%w')) AS day_of_week, delivery_slot_hour_start, delivery_slot_hour_end") ->get();
如果你的数据库是PostgreSQL,可以替换为TO_CHAR(day_of_week::int, 'FMDay')实现同样效果。
方案2:用Laravel访问器在模型层处理(更灵活)
不需要修改查询逻辑,直接在DeliveryOptions模型中定义访问器,自动关联转换:
// 在DeliveryOptions模型中添加以下方法 public function getDayOfWeekNameAttribute() { // 可根据需求调整为中文星期名,比如0=>'周日' $weekMap = [ 0 => 'Sunday', 1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday', ]; return $weekMap[$this->day_of_week] ?? ''; }
查询时正常拉取字段即可,后续直接通过模型实例的day_of_week_name属性拿到星期名:
$options = DeliveryOptions::get(['day_of_week', 'delivery_slot_hour_start', 'delivery_slot_hour_end']); // 访问方式:$options[0]->day_of_week_name
内容的提问来源于stack exchange,提问作者Drewby80
相关产品推荐
相关产品推荐

