Laravel 8 中需用 Eloquent 模型查询并确保日期字段被 $casts 声明为 date/datetime,才能直接调用 Carbon 的 format() 方法;聚合查询返回字符串需用 Carbon::parse() 转换,访问器或 $appends 可统一格式化输出。

在 Laravel 8 中对模型查询出的每日数据(如按日期分组的统计结果)进行字段格式化,关键在于区分“数据库原始值”和“Eloquent 实例对象”。只有后者才具备 Carbon 的链式方法(如 format()),而直接用 DB::table 或聚合查询返回的数组则不具备该能力。
确保日期字段是 Carbon 实例
模型查询默认将 created_at、updated_at 及 $casts 中声明为 'date' 或 'datetime' 的字段自动转为 Carbon 实例。例如:
- 在模型中声明:protected $casts = ['date_field' => 'date'];
- 查询时使用 Eloquent(而非 DB facade):
$data = DailyReport::whereDate('date_field', '>=', '2026-10-01')->get(); - 遍历时可直接格式化:
$item->date_field->format('Y-m-d')
按日分组后格式化日期字段
若需按天聚合(如 GROUP BY DATE(created_at)),推荐用 Eloquent 的 selectRaw + groupBy,再配合访问器或手动解析:
- 用
selectRaw('DATE(created_at) as day')得到字符串,需用Carbon::parse()转换:Carbon::parse($row->day)->format('m/d') - 更稳妥的方式:在模型中定义访问器,统一处理显示逻辑:
public function getDayAttribute() { return $this->attributes['date_field'] ? Carbon::parse($this->attributes['date_field'])->format('Y-m-d') : null; }
避免常见格式化失效问题
以下操作会让日期退化为字符串,失去 format() 能力:
- 调用
pluck('created_at')→ 返回字符串数组,不能链式调用 - 先
toArray()再处理 → 所有日期变字符串 - 用
DB::table()->get()→ 结果是 StdClass 对象,无 Carbon 封装 - 正确做法:始终基于 Eloquent Collection 遍历,保持模型实例上下文
API 或视图中批量格式化输出
若需在 JSON 响应或 Blade 中统一输出格式,可结合 $appends 和访问器:
- 在模型中添加:
protected $appends = ['formatted_date']; - 定义访问器:
public function getFormattedDateAttribute() { return $this->date_field?->format('Y年m月d日'); } - 这样
$model->toJson()或{{ $model->formatted_date }}会自动生效


















