数据库:模型突变体

Introduction

访问器和修改器允许您在从模型中检索属性或设置它们的值时格式化属性。例如,您可能想使用加密服务 加密存储在数据库中的值,然后在您在模型上访问它时自动解密该属性。

除了自定义访问器和修改器之外,您还可以自动将日期字段转换为Carbon 实例甚至将文本值转换为 JSON.

访问器和修改器

定义访问器

要定义访问器,请创建一个getFooAttribute 模型上的方法Foo 是您要访问的列的“驼峰式”大小写名称。在这个例子中,我们将为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 是您要访问的列的“驼峰式”大小写名称。在这个例子中,让我们为first_name 属性。当我们尝试设置first_name 模型上的属性:

<?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 将使用值调用函数Sally.然后,增变器将应用strtolower 函数名称并在内部设置它的值$attributes 大批。

日期突变器

默认情况下,Winter模型将转换created_atupdated_at 列到 a 的实例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 实例,允许您在属性上使用 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';
}

属性铸造

$casts 模型上的 property 提供了一种将属性转换为通用数据类型的便捷方法。这$casts property 应该是一个数组,其中键是要转换的属性的名称,而值是您希望转换到列的类型。支持的转换类型是:integer,real,float,double,string,boolean,objectarray.

例如,让我们投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();
豫ICP备18041297号-2