在 Laravel 模型中实现字段格式化最常用且推荐的方式是使用访问器(Accessors),包括传统 get{Attribute}Attribute 方法和 Laravel 10+ 推荐的 Attribute::make() 声式写法,并可配合 $casts 和 $appends 实现日期、布尔、JSON 格式化及动态添加非数据库字段。

在 Laravel 模型中实现字段格式化,最常用且推荐的方式是使用访问器(Accessors)。它让开发者能在读取数据库字段时自动转换值,无需每次手动处理,保持逻辑集中、可维护性强。
用 get{Attribute}Attribute 方法定义访问器
这是 Laravel 传统且兼容性最好的方式。方法名需遵循驼峰命名规则,对应数据库字段的下划线形式(如 first_name → getFirstNameAttribute)。
- 参数 $value 是数据库中原始存储的值,直接可用
- 返回值会替代原始字段值,被 $model->first_name 等调用直接获取
- 适用于文本处理、状态映射、金额单位换算等场景
示例:将用户等级数字转为中文描述
public function getUserLevelAttribute($value)
{
$levels = [1 => '普通会员', 2 => 'VIP', 3 => '至尊会员'];
return $levels[$value] ?? '未知等级';
}
用 Attribute::make() 声明式写法(Laravel 10+ 推荐)
更现代、语义清晰,支持 getter/setter 分离,适合新项目或重构场景。
- 需引入 Illuminate\Database\Eloquent\Casts\Attribute
- 闭包内可自由操作 $value,也支持访问模型其他属性(如 $this->email)
- 天然支持类型提示与 IDE 自动补全
示例:拼接用户全名
protected function fullName(): Attribute
{
return Attribute::make(
get: fn ($value) => trim("{$this->first_name} {$this->last_name}")
);
}
配合 $casts 实现轻量级日期/布尔/JSON 格式化
对于常见类型(尤其是日期),$casts 比手写访问器更简洁高效,底层已集成 Carbon 和自动类型转换。
- 'created_at' => 'datetime:Y-m-d H:i':直接输出指定格式字符串
- 'is_active' => 'boolean':把 0/1 或 't'/'f' 统一转为 true/false
- 'metadata' => 'array':自动 json_decode / json_encode
注意:$casts 返回的是对象或基础类型,若需字符串格式(如前端展示用),仍建议搭配访问器或用 datetime: 后缀。
通过 $appends 动态添加非数据库字段
当格式化结果不对应任何真实字段(比如“距今发布时间”),可用 $appends 主动注入新属性。
- 先定义访问器方法(如 getDaysAgoAttribute)
- 再在模型中声明 protected $appends = ['days_ago']
- 该属性会随 toArray() 或 toJson() 一起输出
示例:计算文章发布天数
protected $appends = ['days_ago'];
public function getDaysAgoAttribute()
{
return $this->created_at ? $this->created_at->diffInDays(now()) : null;
}


















