2026-04-12 05:05:09
Laravel Eloquent 的访问器(Accessors)和修改器(Mutators)用于实现字段值的自动格式化处理,分别在读取和写入时对数据进行转换。以下是具体使用方法及注意事项:
一、定义访问器(Accessors)访问器用于在从数据库读取字段值后进行格式化处理,例如大小写转换、日期格式化等。
在 Eloquent 模型中创建对应方法。
方法接收原始值 $value 作为参数,返回处理后的值。
将 first_name 字段值转为首字母大写:public function getFirstNameAttribute($value) { return ucfirst($value);}
调用 $model->first_name 时,返回自动处理后的结果。
修改器用于在数据写入数据库前进行预处理,例如标准化格式、加密等。
在模型中定义方法。
通过 $this->attributes['field_name'] 修改字段值。
存储邮箱前转为小写:public function setEmailAttribute($value) { $this->attributes['email'] = strtolower($value);}
设置 $model->email = 'User@Example.com' 时,实际存入数据库的为全小写。
Laravel 默认通过 $dates 属性处理日期字段,但可通过访问器自定义显示格式。
将字段加入 protected $dates 数组(Laravel 5.3+ 推荐使用 $casts 替代部分场景)。
定义访问器返回格式化后的字符串:
public function getCreatedAtAttribute($value) { return CarbonCarbon::parse($value)->format('Y-m-d H:i');}调用 $model->created_at 时返回格式化后的时间。
通过访问器创建不存储于数据库的虚拟属性,用于动态组合字段值。
定义无参数的访问器,返回组合值。
示例:生成全名:
public function getFullNameAttribute() { return $this->first_name . ' ' . $this->last_name;}调用 $model->full_name 即可获取拼接结果。
字段名含多个下划线时(如 is_active_flag),访问器命名为 getIsActiveFlagAttribute。
遵循驼峰命名规范,避免大小写错误。
避免在访问器中执行耗时操作(如数据库查询、远程请求)。
日期处理推荐使用 Carbon 库的缓存机制。
修改器中仅修改当前字段值,避免意外覆盖其他属性。
虚拟属性不应依赖可能为 null 的字段,需添加空值检查。
示例:完整模型实现
namespace AppModels;use IlluminateDatabaseEloquentModel;class User extends Model { // 日期字段自动转换 protected $dates = ['created_at', 'updated_at']; // 访问器:首字母大写 public function getFirstNameAttribute($value) { return ucfirst($value); } // 修改器:邮箱转小写 public function setEmailAttribute($value) { $this->attributes['email'] = strtolower($value); } // 日期格式化 public function getCreatedAtAttribute($value) { return CarbonCarbon::parse($value)->format('Y-m-d'); } // 虚拟属性:全名 public function getFullNameAttribute() { return trim($this->first_name . ' ' . $this->last_name); }}通过合理使用访问器和修改器,可显著提升数据处理的便捷性与一致性,同时保持代码的简洁性。