作者:拾年之璐 公众号:知行研究院
8.1 模型的访问器
什么是访问器?
访问器
,就是在获取数据列表时,拦截属性并对属性进行修改。
访问器
是写在模型里的方法,其命名格式是固定的:
访问器命名:前固定get,后固定Attribute,中间加字段名。
比如:字段名为gender,则访问器为:getGenderAttribute。
再如:字段名为user_name,则访问器为:getUserNameAttribute。
下面是几个示例:
1、比如:在输出性别的时候,给性别加上括号,则可在模型User.php
中,添加如下方法:
//参数$value 是源字段值,可修改返回
public function getGenderAttribute($value)
{
return '【'.$value.'】';
}
执行结果:
2、比如:表中的状态为数字,数字代指某种状态,则可在控制器中写入访问器:
public function getStatusAttribute($value)
{
$retStatus = [
-3 => '已删除',
-2 => '已屏蔽',
-1 => '已拉黑',
0 => '正常',
1 => 'VIP',
2 => 'SVIP',
];
return $retStatus[$value];
}
执行结果:
3、我们也可以创建一个虚拟字段
,用已有的数据字段进行整合,不过要进行数据追加。
首先在模型中追加虚拟字段:
//将虚拟字段追加到数据对象列表里去
protected $appends = ['info'];
然后再创建虚拟字段的访问器:
//创建一个虚拟字段
public function getInfoAttribute()
{
return $this->username.'-'.$this->gender;
}
然后直接执行的话,输出的结果是这样的:
这是因为我们在前面,对性别字段的访问器进行了修改,所以这里会得到前面修改后的结果。
如果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'
];
以上。