访问器和更改器允许您在从模型中检索属性或设置其值时设置其格式。
比如
您可能想使用[加密服务](…/ services / encryption)对值进行加密,以将其存储在数据库中,然后在模型上访问属性时自动对其进行解密。
除了自定义访问器和变量外,您还可以自动将日期字段强制转换为[Carbon](https://github.com/briannesbitt/Carbon)实例,甚至[将文本值转换为JSON](#attribute-casting)。
要定义访问器,请在模型上创建一个“ getFooAttribute”方法,其中“ Foo”是您要访问的列的驼峰写法。
在这个例子中,我们将为“ first_name”属性定义一个访问器。尝试检索“ first_name”的值时,访问器将被自动调用:
如上,该列的原始值被传递给访问器,使您可以操纵并返回该值
要访问访问器的值,您可以简单地访问first_name
属性:
$user = User::find(1);
$firstName = $user->first_name;
要定义一个变量,请在模型上定义一个“ setFooAttribute”方法,其中“ Foo”是您要访问的列的驼峰写法。
在此示例中,让我们为“ first_name”属性定义一个变量。
当我们尝试在模型上设置“ first_name”属性的值时,将自动调用此mutator:
attributes['first_name'] = strtolower($value);
}
}
mutator将接收将要放到属性上的值
然后操作该值
并在模型上的 $attributes
属性上设置操纵后的值
例如,如果我们尝试将“ first_name”属性设置为“ Sally”:
$user = User::find(1);
$user->first_name = 'Sally';
这里的setFirstNameAttribute函数将以值Sally调用。
然后,更改器将对名称应用strtolower函数,并在内部$ attributes数组中设置其值。
默认情况下,October的model会将“created”和“updated”列转换为[Carbon]的实例(https://github.com/briannesbitt/Carbon)对象
它提供了各种有用的方法并扩展了本机PHPDateTime
类。
你可以自定义哪个字段可以被自动变更,甚至通过覆写 $dates
属性来完全禁用此变更
class User extends Model
{
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['created_at', 'updated_at', 'disabled_at'];
}
当某列被视为日期时,您可以将其值设置为UNIX时间戳,日期字符串(Y-m-d
),日期时间字符串,当然还有DateTime
/Carbon
实例,日期的值将自动正确存储在数据库中:
$user = User::find(1);
$user->disabled_at = Carbon::now();
$user->save();
如上所述,在检索$ dates属性中列出的属性时,它们将自动转换为[Carbon](https://github.com/briannesbitt/Carbon)实例,允许您使用Carbon的任何方法根据您的属性:
$user = User::find(1);
return $user->disabled_at->getTimestamp();
默认情况下,时间戳记格式为'Y-m-d H:i:s'
.如果您需要自定义时间戳格式,请在模型上设置$ dateFormat
属性。
此属性确定日期属性在数据库中的存储方式,以及将模型序列化为数组或JSON时的格式:
class Flight extends Model
{
/**
* 模型的日期列的存储格式。
*
* @var string
*/
protected $dateFormat = 'U';
}
模型上的$casts
属性提供了一种将属性转换为通用数据类型的便捷方法。
$casts
属性应该是一个数组,其中键是要转换的属性的名称,而值是希望转换为列的类型。
支持的转换类型为:: integer
, real
, float
, double
, string
, boolean
, object
and array
.
例如,让我们将 is_admin
属性强制转换为布尔值,该属性以整数(0
or 1
)的形式存储在我们的数据库中:
For example, let’s cast the is_admin
attribute, which is stored in our database as an integer (0
or 1
) to a boolean value:
class User extends Model
{
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'is_admin' => 'boolean',
];
}
现在,即使将基础值作为整数存储在数据库中,当您访问它时,is_admin属性也将始终转换为布尔值
$user = User::find(1);
if ($user->is_admin) {
//
}
当处理存储为序列化JSON的列时,array
cast类型特别有用。
例如,如果数据库的“TEXT”字段类型包含序列化的JSON,
如果在数据库中添加了一个JSON属性,则当您将该属性反序列化到数据库时,将自动对该属性进行序列化
当您在Eloquent model上访问该属性时,如果向该属性添加“array”转换
将自动将该属性反序列化为PHP数组:
class User extends Model
{
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'options' => 'array',
];
}
一旦定义了强制转换,就可以访问“options”属性,它将自动从JSON反序列化到PHP数组中。当您设置“options”属性的值时,给定的数组将自动序列化回JSON以供存储:
$user = User::find(1);
$options = $user->options;
$options['key'] = 'value';
$user->options = $options;
$user->save();