如何在Laravel 9模型中将created_at转换为diffForHumans()格式
Laravel 9模型实现created_at返回diffForHumans()格式的方案
为什么原写法不可行
$casts 是类的静态属性,在类初始化阶段无法调用 $this->created_at;同时 $casts 的作用是将数据库字段转换为指定类型(如datetime对应Carbon实例),并非直接生成格式化后的字符串,因此直接在$casts中调用diffForHumans()的写法无效。
解决方案:使用访问器(Accessor)
访问器是Laravel提供的自定义属性获取逻辑的方式,适合动态生成格式化后的字段值,有两种常用方式:
方式1:覆盖原生created_at属性的返回值
如果希望直接访问$model->created_at时就得到diffForHumans()格式的结果,在模型中定义如下方法:
public function getCreatedAtAttribute($value) { return \Carbon\Carbon::parse($value)->diffForHumans(); }
此时访问模型的created_at属性,会直接返回类似2 days ago的字符串。
方式2:新增自定义属性保留原生字段
如果需要同时保留原生Carbon类型的created_at(用于其他业务逻辑),可以新增一个自定义属性:
// 新增自定义属性到模型的附加字段列表 protected $appends = ['created_at_human']; // 定义自定义属性的访问器 public function getCreatedAtHumanAttribute() { return $this->created_at->diffForHumans(); }
之后访问$model->created_at_human即可得到格式化后的结果,$model->created_at依然是Carbon实例,不影响原有使用场景。
补充:API序列化场景
如果仅需要在模型转为数组/JSON(如API返回)时包含格式化后的字段,上述方式2的$appends配置会自动将created_at_human字段加入序列化结果,无需额外处理。
内容的提问来源于stack exchange,提问作者Sakib Hasan
相关产品推荐
相关产品推荐

