消息

Laravel 14 为 Eloquent 模型添加了 defaults() 方法

发布
Laravel 14 为 Eloquent 模型添加了 defaults() 方法(图片)

Eloquent 模型使用以下方式设置默认属性值: $attributes 属性。它适用于固定值,但 PHP 只允许在属性的默认值中使用常量表达式,因此您不能调用 config() , now() 或者那里有一个功能标志。 Laravel 14 增加 defaults() 返回与模型创建时运行的代码相同的数组的方法。

前后对比

以订阅模式为例,新用户可享受 14 天试用期,而长期用户则可享受 30 天试用期。 extended-trials 功能标志已启用。 $attributes 必须在构造函数中检查该标志:

班级 订阅 延伸 模型
{
受保护 $属性 = [
'取消' => 错误的 ,
'trial_days' => 14 ,
];
民众 功能 __构造 ( 大批 $属性 = [])
{
如果 ( 特征 :: 积极的 ( “延长试验” )){
$this -> 属性[ 'trial_days' ] = 30 ;
}
父级:: __构造 ($属性)
}
}

在 Laravel 14 中,同样的逻辑也适用。 defaults() :

班级 订阅 延伸 模型
{
受保护 功能 默认值 () : 大批
{
返回 [
'取消' => 错误的 ,
'trial_days' => 特征 :: 积极的 ( “延长试验” ) ? 30 : 14 ,
'expires_at' => 现在 () -> 增加天数 ( 配置 ( 'billing.grace_period' )) -> 转为日期时间字符串 (),
];
}
}
订阅 = 新的 订阅 ;
订阅 -> 试用天数; // 当标志激活时为 30,否则为 14

Laravel 11 对类型转换也做了同样的改动,当时应用程序框架从 $casts 财产 casts() 方法 ( 模型转换正在转向 Laravel 11 中的方法 )。 defaults() 给出 $attributes 还有一个方法版本。

工作原理

模型构造函数调用 defaults() 并将结果合并到 $attributes 构造函数中的顺序决定了哪个值生效:

  1. 来自以下方面的值 $attributes 首先设置属性
  2. defaults() 合并后的结果会覆盖它们,因此当两者都定义相同的键时,合并后的结果优先。
  3. 您传递给的属性 new , create() , 或者 fill() 最后应用,因此它们胜过两者
订阅 = 订阅 :: 创造 ([ 'trial_days' => 60 ]);
订阅 -> 试用天数; // 60

默认值会在模型同步其原始属性之前合并,因此它们不计入脏更改。但它们仍然会在模型插入时写入数据库,与原始值相同。 $attributes 。

原始值

喜欢 $attributes ,这些值来自 defaults() 是原始值。它们未经类型转换或修改。返回的值与数据库中存储的值完全相同:

受保护 功能 默认值 () : 大批
{
返回 [
// 转换为 `array` 的列需要一个 JSON 字符串。
'设置' => json_encode ([ '主题' => '光' ]),
// 日期列
'expires_at' => 现在 () -> 增加天数 ( 30 ) -> 转为日期时间字符串 (),
];
}

返回一个 PHP 数组,用于指定列类型。 array 或者 json 读取属性时失败,因为类型转换需要 JSON 字符串。

当 defaults() 运行时

这 defaults() 每次构建模型实例时都会运行该方法。这包括从数据库加载的模型。Eloquent 会为检索到的每一行数据创建一个新的模型实例,因此 defaults() 每行运行一次,然后将该行的值替换默认值。

升级

该方法针对 Laravel 14,因为现有模型可能已经存在一个名为“ defaults() 在 Laravel 14 中,构造函数会调用该函数并将其返回值合并到属性中。升级前,请检查您的模型中是否存在该函数:

紧握 -rn “函数默认值” 应用程序/模型

重命名所有不打算返回默认属性值的方法。

杰克·贝利斯 贡献了该方法 #61688 它并入了 master 分支,在 Laravel 14 发布之前可能会发生变化。

进一步阅读

保罗·雷德蒙德照片

Laravel News 特约撰稿人。全栈 Web 开发人员兼作家。

归档于

赞助

掌握 Laravel 标志
Laravel 代码审查

几天内即可获得 Laravel 代码审查方面的专家指导

访问 Laravel 代码审查
Laravel AI SDK 和 Laravel MCP 安全修复:立即更新 图片

Laravel AI SDK 和 Laravel MCP 安全修复:立即更新

阅读文章
Laravel 邮箱:预览和测试渲染后的邮件图片

Laravel 邮箱:预览和测试渲染后的邮件

阅读文章
Laravel 13.34 图片中将 Worker 崩溃计数作为作业异常

Laravel 13.34 中将 Worker 崩溃计数为作业异常

阅读文章
Elastic Bridge:Elasticsearch 和 OpenSearch 的 Eloquent 风格查询(图片)

Elastic Bridge:Elasticsearch 和 OpenSearch 的 Eloquent 风格查询

阅读文章
Laravel 发布周期:版本、支持策略和日期(图片)

Laravel 发布周期:版本、支持策略和日期

阅读文章
Unlearn.dev 将于 10 月 10 日和 11 日周末免费开放(图片)。

Unlearn.dev 将于 10 月 10 日和 11 日周末免费开放。

阅读文章