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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:30:51