【Laravel】8. 模型的访问器、修改器

2,016 阅读2分钟

作者:拾年之璐   公众号:知行研究院

8.1 模型的访问器

什么是访问器?

访问器,就是在获取数据列表时,拦截属性并对属性进行修改。

访问器是写在模型里的方法,其命名格式是固定的:

访问器命名:前固定get,后固定Attribute,中间加字段名。

比如:字段名为gender,则访问器为:getGenderAttribute。

再如:字段名为user_name,则访问器为:getUserNameAttribute。

下面是几个示例:

1、比如:在输出性别的时候,给性别加上括号,则可在模型User.php中,添加如下方法:

//参数$value 是源字段值,可修改返回
public function getGenderAttribute($value)
{
    return '【'.$value.'】';
}

执行结果:

image-20210205153809899

2、比如:表中的状态为数字,数字代指某种状态,则可在控制器中写入访问器:

public function getStatusAttribute($value)
{
    $retStatus = [
        -3 => '已删除',
        -2 => '已屏蔽',
        -1 => '已拉黑',
        0 => '正常',
        1 => 'VIP',
        2 => 'SVIP',
    ];
    return $retStatus[$value];
}

执行结果:

image-20210205154304489

3、我们也可以创建一个虚拟字段,用已有的数据字段进行整合,不过要进行数据追加。

首先在模型中追加虚拟字段:

//将虚拟字段追加到数据对象列表里去
protected $appends = ['info'];

然后再创建虚拟字段的访问器:

//创建一个虚拟字段
public function getInfoAttribute()
{
    return $this->username.'-'.$this->gender;
}

然后直接执行的话,输出的结果是这样的:

image-20210205154547688

这是因为我们在前面,对性别字段的访问器进行了修改,所以这里会得到前面修改后的结果。

如果gender 之前已经有访问器修改过,上面的方法会得到修改过的结果;

如果要使用源字段进行修改,需要使用下面这种格式:

//创建一个虚拟字段
public function getInfoAttribute()
{
    return $this->attributes['username'].'-'.$this->attributes['gender'];
}

这时输出的新的info字段才是:蜡笔小新-男

8.2 模型的修改器

修改器,相对于访问器,是在写入数据库的时候拦截,进行修改后,再写入。

修改器的命名方法和访问器一致,只不过是将get修改为set。

以下几个示例讲述其大概作用:

1、大小写转换:

//修改器,写入数据时,将邮箱转换为大写
public function setEmailAttribute($value)
{
    $this->attributes['email'] = strtoupper($value);
}

2、可以添加默认的日期列,默认created_at 和updated_at;

//设置可以自动写入日期的列
protected $dates = [
    'details'
];

3、可以设置字段输出的类型,比如设置一个布尔型,输出时就是true 和false;

//设置字段类型
protected $casts = [
    'details' => 'boolean'
];

以上。