💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 属性操作 ### 介绍 访问器和更改器允许您在从模型中检索属性或设置其值时设置其格式。例如,您可能希望使用[加密服务](https://octobercms.com/docs/services/encryption)对存储在数据库中的值进行加密,然后在模型上访问属性时自动对其进行解密。 除了自定义访问器和变量外,您还可以自动将日期字段强制转换为[Carbon](https://github.com/briannesbitt/Carbon)实例,甚至[将文本值强制转换为JSON](https://octobercms.com/docs/database/mutators#attribute-casting)。 ### [](https://octobercms.com/docs/database/mutators#accessors-and-mutators)存取器和更改器 #### 定义访问器 要定义访问器,请`getFooAttribute`在模型上创建一个方法,其中`Foo`是您要访问的列的“ camel”大小写名称。在此示例中,我们将为`first_name`属性定义一个访问器。尝试检索以下值时,将自动调用访问器`first_name`: ~~~ <?php namespace Acme\Blog\Models; use Model; class User extends Model { /** * Get the user's first name. * * @param string $value * @return string */ public function getFirstNameAttribute($value) { return ucfirst($value); } } ~~~ 如您所见,该列的原始值被传递给访问器,使您可以操纵并返回该值。要访问访问器的值,您可以简单地访问`first_name`属性: ~~~ $user = User::find(1); $firstName = $user->first_name; ~~~ #### 定义增幅器 要定义变量,请`setFooAttribute`在模型上定义一个方法,其中`Foo`要访问的列的“ camel”大小写名称是。在此示例中,让我们为`first_name`属性定义一个变量。当我们尝试`first_name`在模型上设置属性值时,将自动调用此mutator: ~~~ <?php namespace Acme\Blog\Models; use Model; class User extends Model { /** * Set the user's first name. * * @param string $value * @return string */ public function setFirstNameAttribute($value) { $this->attributes['first_name'] = strtolower($value); } } ~~~ 增变器将接收在属性上设置的值,从而允许您操纵该值并在模型的内部`$attributes`属性上设置操纵的值。例如,如果我们尝试将`first_name`属性设置为`Sally`: ~~~ $user = User::find(1); $user->first_name = 'Sally'; ~~~ 此处`setFirstNameAttribute`将使用value调用该函数`Sally`。然后,`strtolower`更改器会将函数应用于名称,并在内部`$attributes`数组中设置其值。 ### [](https://octobercms.com/docs/database/mutators#date-mutators)日期变量 默认情况下,十月份的Models会将`created_at`and`updated_at`列转换为[Carbon](https://github.com/briannesbitt/Carbon)对象的实例,该对象提供了各种有用的方法并扩展了本机PHP`DateTime`类。 您可以通过覆盖`$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 { /** * The storage format of the model's date columns. * * @var string */ protected $dateFormat = 'U'; } ~~~ ### [](https://octobercms.com/docs/database/mutators#attribute-casting)属性转换 `$casts`模型上的属性提供了一种将属性转换为通用数据类型的便捷方法。该`$casts`属性应该是一个数组,其中键是要转换的属性的名称,而值是希望转换为列的类型。支持的铸件类型有:`integer`,`real`,`float`,`double`,`string`,`boolean`,`object`和`array`。 例如,让我们将`is_admin`属性转换为布尔值,该属性以整数(`0`或`1`)的形式存储在数据库中: ~~~ 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) { // } ~~~ #### 数组转换 `array`当使用存储为序列化JSON的列时,强制类型转换特别有用。例如,如果您的数据库具有`TEXT`包含序列化JSON的字段类型,`array`则在Eloquent模型上访问该属性时,将强制类型转换添加到该属性将自动将该属性反序列化为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(); ~~~