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

为什么Laravel API Resource中created_at格式和BaseModel设置不一致

问题原因
  • 你在BaseModel中重写的serializeDate方法,仅在直接对Eloquent模型执行toArray()/toJson()序列化时生效,只有直接在控制器返回模型实例的场景才会调用该方法。
  • 你在API Resource的toArray方法中直接读取$this->created_at属性时,拿到的是原始的Carbon对象,不会触发模型的serializeDate逻辑。Laravel的API Resource在最终序列化响应时,会对Carbon对象调用默认的toJSON()方法,该方法的输出格式和你自定义的toIso8601String()结果不一致,因此出现格式被修改的问题。
解决方案

你可以选择任意一种方式统一格式:

  1. Resource中手动调用自定义格式方法
    直接在Resource中对日期字段调用你需要的格式方法即可:
    'created_at' => $this->created_at->toIso8601String(),
    
  2. 全局修改Carbon的序列化默认格式
    在AppServiceProvider的boot方法中添加全局配置,让所有Carbon对象序列化时都使用你指定的格式:
    use Carbon\Carbon;
    
    public function boot()
    {
        Carbon::serializeUsing(function ($carbon) {
            return $carbon->toIso8601String();
        });
    }
    
  3. 在Resource中复用模型的序列化方法
    如果你不想单独处理每个日期字段,也可以直接调用模型已经重写好的序列化方法:
    'created_at' => $this->serializeDate($this->created_at),
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:54:03