Laravel 9自定义时间戳字段未按ISO 8601格式返回求助
解决Laravel 9自定义日期字段返回ISO8601格式问题
问题分析
默认的created_at/updated_at能返回ISO8601格式(如2022-11-16T15:02:44.000000Z),但自定义的questions_updated_at字段返回Y-m-d H:i:s格式,核心原因是Laravel没有自动识别这个自定义字段为日期类型——默认的timestamps字段是框架自动注册的日期字段,会被当作Carbon实例处理,序列化时遵循$dateFormat设置,而自定义字段需要手动声明。
解决方案
方法1:通过$dates属性声明日期字段
在你的MyClass模型中添加$dates属性,将自定义字段加入其中:
class MyClass extends Model { protected $dateFormat = \DateTime::ISO8601; // 声明所有需要按日期格式处理的字段 protected $dates = ['created_at', 'updated_at', 'questions_updated_at']; }
方法2:通过$casts属性指定字段类型
也可以用$casts明确指定字段类型为datetime,效果与$dates一致:
class MyClass extends Model { protected $dateFormat = \DateTime::ISO8601; protected $casts = [ 'questions_updated_at' => 'datetime', ]; }
优化填充器代码
无需手动将Carbon实例格式化为字符串,直接赋值Carbon实例即可,Laravel会自动处理存储格式:
"questions_updated_at" => Carbon::now(), 'created_at' => Carbon::now(), "updated_at" => Carbon::now()
验证效果
修改后重新请求接口,questions_updated_at会和默认字段一致,返回ISO8601格式的日期字符串。
内容的提问来源于stack exchange,提问作者Maseed
相关产品推荐
相关产品推荐

