跳转到主要内容

什么是 Cast

Eloquent 的 Cast 是将从数据库取出的原始值转换为 PHP 数据类型的机制,保存时会反向转换回去。在 casts 方法中定义。

内置 Cast 一览

Laravel 标准提供的 Cast 列表如下。
AsArrayObjectAsCollection 为了让你能直接修改数组的特定偏移,在 Laravel 内部实际是以自定义 Cast 实现的。

创建自定义 Cast 类

当内置 Cast 无法满足转换需求时,可以通过实现 CastsAttributes 接口创建自定义 Cast。

接口定义

框架本体的契约定义如下。
$attributes 参数中包含模型的全部属性,因此也可以做跨多列的转换(参见后文的 Value Object 模式)。

基础自定义 Cast 实现

使用 make:cast 命令生成模板。
将生成 app/Casts/AsMoney.php。举例来说,我们实现一个将金额(以整数存储)转换为 Money Value Object 的 Cast。
在模型上应用该 Cast。
这样 $order->price 就会返回 Money 实例。

Value Object Cast

将多个 DB 列打包为一个 Value Object 的模式。

实现示例:地址 Cast

address_line_oneaddress_line_two 两列合并为 Address Value Object。
set 方法返回数组时,Eloquent 会以键作为列名,将值保存到相应的列。单列 Cast 时则返回字符串或整数。
在模型中应用并使用如下:

Value Object 的缓存

被转换为 Value Object 的属性值会被 Eloquent 缓存。对同一属性访问两次会返回同一对象实例。 若要禁用缓存,在 Cast 类中添加 $withoutObjectCaching 属性。

入站 Cast(仅写入)

只在写入 DB 时进行转换,读取时不做转换的 Cast。实现 CastsInboundAttributes 接口即可。 典型用途是哈希。仅在保存密码或密钥时转换,读取时直接返回哈希值。

Cast 参数

若要向自定义 Cast 传入参数,在类名后用冒号分隔指定,多参数用逗号分隔。
参数会传递给 Cast 类的构造函数。

Castables:让 Value Object 持有 Cast 逻辑

实现 Castable 接口的 Value Object 拥有返回其 Cast 类的 castUsing 方法。这样模型侧无需知道具体的 Cast 类,领域逻辑更加整洁。
模型侧改为指定 Value Object 类,而不是 Cast 类。
Castable 与匿名类结合,可以把 Value Object 与 Cast 逻辑写在同一个文件里。

$appends$hidden 的交互

Cast 与 $appends$hidden 是相互独立的机制,但组合使用时需要注意。
$hidden 中要指定的是 DB 列名。请填写原列名(address_line_one, address_line_two),而不是通过 Cast 生成的属性名(address)。

运行时追加 Cast

当只想为特定查询或请求追加 Cast 时,使用 mergeCasts 方法。

下一步

Eloquent Observer 与模型事件

学习如何在模型的保存、删除等生命周期事件上挂钩以追加处理。
最后修改于 2026年7月18日