自定义 Casts 可实现数据自动转换,如大写处理和加密存储。创建类实现 CastsAttributes 接口,定义 get 和 set 方法,用于读取和写入时的数据处理。在模型 $casts 属性中注册后,可自动对指定字段进行转换,提升代码安全与维护性。

在 Laravel 中,Eloquent 模型的 Casts 功能允许你自动将数据库中的字段转换为更易用的数据类型。除了内置的 cast 类型(如 int、json、datetime 等),你还可以通过自定义 Casts 来处理特定格式的数据,比如加密字段、序列化对象、格式化地址等。
创建自定义 Casts 类
要为 Eloquent 模型添加自定义 Casts,首先需要创建一个实现 Illuminate\Contracts\Database\Eloquent\CastsAttributes 接口的类。这个类需定义两个方法:get 和 set,分别用于从数据库读取时的转换和写入数据库前的处理。
例如,我们想将用户的姓名字段在存储时转为大写,读取时保持原样:
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class UppercaseName implements CastsAttributes
{
public function get($model, $key, $value, $attributes)
{
return $value;
}
public function set($model, $key, $value, $attributes)
{
return strtoupper($value);
}
}
在模型中使用自定义 Casts
定义好 Casts 类后,在 Eloquent 模型的 $casts 属性中注册它:
namespace App\Models;
use App\Casts\UppercaseName;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $casts = [
'name' => UppercaseName::class,
];
}
这样,每次保存 name 字段时,都会自动转为大写;读取时则返回原始值(未修改)。
更复杂的自定义 Casts 示例:加密字段
假设你想自动加密某些敏感字段(如身份证号),可以这样实现:
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class Encrypted implements CastsAttributes
{
public function get($model, $key, $value, $attributes)
{
return decrypt($value);
}
public function set($model, $key, $value, $attributes)
{
return encrypt($value);
}
}
然后在模型中使用:
protected $casts = [
'id_number' => Encrypted::class,
];
这样,id_number 在存入数据库时会被自动加密,读取时自动解密。
注意事项
- 自定义 Casts 类必须实现
CastsAttributes接口。 - 确保加密/解密操作在安全环境下进行,且密钥配置正确。
- 某些 Casts(如 JSON)已有内置支持,无需重复造轮子。
- 自定义 Casts 不影响数据库迁移,字段类型仍需手动设置(如
VARCHAR或TEXT)。










