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
构造函数中的顺序决定了哪个值生效:
- 来自以下方面的值
$attributes首先设置属性 defaults()合并后的结果会覆盖它们,因此当两者都定义相同的键时,合并后的结果优先。- 您传递给的属性
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 发布之前可能会发生变化。







