普通的访问使用可以参考手册,可是手册例子比较简单,更复杂的环境就不知道如何使用:
【访问器】工作原理:
先获得 ORM 模型后(查询结果后),然后访问这个模型里面的属性时,会调用 getXxAttribute 类型的方法,(xx就是属性名):
例如:
已经有数据模型 UserModel 且继承了 Illuminate\Database\Eloquent\Model
<?php namespace App; use Illuminate\Database\Eloquent\Model; class UserModel extends Model { //..... /** * 【访问器】获得用户状态中文解释,且状态还是要根据有效期来判断。 * @param $value * @return array */ public function getStatusTextAttribute($value) { $expiry_time = $this->getOriginal('expiry_time'); if($expiry_time < time()){ return '已到期'; }elseif($this->getOriginal('status') == 4){ return '已锁定'; } return '正常'; } /** * 设定用户的名字。 * * @param string $value * @return void */ public function setFirstNameAttribute($value) { $this->attributes['first_name'] = strtolower($value); } }
使用:
$resultModel = (new UserModel())->find(1);
echo $resultModel->status_text; //显示 已到期、已锁定或正常中文。
echo $resultModel->status; //显示 数字
这个作用可以巧妙的用在字段输出解析或二次处理,避免单独处理。
----------------------------------------------
【修改器】工作原理:
也是获得查询结果模型后,重新赋值,会调用 setXxAttribute 类型的方法,对属性进行修改,然后在使用的时候,就是新的属性。
再次以上面 UserModel 代码为例子:
$resultModel = App\User::find(1);
$resultModel->first_name = 'Sally'; //会调用修改器 setFirstNameAttribute() ,把 first_name 修改成小写。
echo $resultModel->first_name; //显示的是 sally
------------------------------------------------
【其他技巧】
模型里面,会有原始值和属性值区别,原始值是从数据库取出的原值或者接收到的原值,还未进行处理。
处理后,就是属性值。
获得原始值方法:$this->getOriginal();
属性值获取就简单多了:$this->getAttribute(); 或 $this->attributes['属性名']