October cms(数据库-Mutators)

Model Mutators 模块访问器


Introduction 介绍

访问器和更改器允许您在从模型中检索属性或设置其值时设置其格式。
比如
您可能想使用[加密服务](…/ services / encryption)对值进行加密,以将其存储在数据库中,然后在模型上访问属性时自动对其进行解密。

除了自定义访问器和变量外,您还可以自动将日期字段强制转换为[Carbon](https://github.com/briannesbitt/Carbon)实例,甚至[将文本值转换为JSON](#attribute-casting)。

Accessors & mutators 存取

Defining an accessor 定义访问器

要定义访问器,请在模型上创建一个“ getFooAttribute”方法,其中“ Foo”是您要访问的列的驼峰写法。
在这个例子中,我们将为“ first_name”属性定义一个访问器。尝试检索“ first_name”的值时,访问器将被自动调用:

<?php namespace Acme\Blog\Models;

use Model;

class User extends Model
{
    /**
     * 获取用户的first name
     *
     * @param  string  $value
     * @return string
     */
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}

如上,该列的原始值被传递给访问器,使您可以操纵并返回该值
要访问访问器的值,您可以简单地访问first_name属性:

$user = User::find(1);

$firstName = $user->first_name;
Defining a mutator 定义更改器

要定义一个变量,请在模型上定义一个“ setFooAttribute”方法,其中“ Foo”是您要访问的列的驼峰写法。
在此示例中,让我们为“ first_name”属性定义一个变量。
当我们尝试在模型上设置“ first_name”属性的值时,将自动调用此mutator:

<?php namespace Acme\Blog\Models;

use Model;

class User extends Model
{
    /**
     * set用户的first name.
     *
     * @param  string  $value
     * @return string
     */
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = strtolower($value);
    }
}

mutator将接收将要放到属性上的值
然后操作该值
并在模型上的 $attributes 属性上设置操纵后的值
例如,如果我们尝试将“ first_name”属性设置为“ Sally”:

$user = User::find(1);

$user->first_name = 'Sally';

这里的setFirstNameAttribute函数将以值Sally调用。
然后,更改器将对名称应用strtolower函数,并在内部$ attributes数组中设置其值。

Date mutators 日期变更器

默认情况下,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';
}

Attribute casting 属性转换

模型上的$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) {
    //
}
Array casting 数组转换

当处理存储为序列化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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值