laravel Eloquent ORM —— 访问器使用技巧

阅读数: 1252 2018年06月17日

普通的访问使用可以参考手册,可是手册例子比较简单,更复杂的环境就不知道如何使用:

【访问器】工作原理:


先获得 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['属性名']


phpriji.cn | 网站地图 | 沪ICP备17015433号-1