Laravel 访问器 $appends 忽略的问题
1.当我们使用getxxxxAttribute通过$appends追加xxxx属性时,可能会遇到这样的需要:通过模型某个属性$this->attributes['某个字段'],计算出 该xxxx属性。这样可能会报错。原因是在获取select时没有获取该字段(并不是每次都会使用该数据库字段),所以$this->attributes取不出该字段属性报错。所以一定要加判断:
if (!array_key_exists('某个字段', $this->attributes)) {
return ' ';
}else{
//计算xxxx属性
}
- 使用getxxxxAttribute通过$appends追加xxxx属性时,也可能会遇到这样的需要:通过查询数据库,计算获取改xxxx属性。这样做的坑就是,无论你是否用到该xxxx属性,都会去查询数据库,这无疑在暗中损耗性能(别人的坑,别人用到就追加该属性,才不管你用不用)。通过网上查找我的解决:
//在模型中加一个静态变量用于判断 public static $withoutAppends = false;//默认要$appends追加属性 //getxxxxAttribute方法加个判断 public function gexxxxAttribute(){ if(self::$withoutAppends){ return ' '; } //查数据库 }
//在控制器或者其他构造函数中注入使用该模型时,就可以控制是否追加该xxxx属性。 public function __construct(Model $model) { $model::$withoutAppends = true;//不要$appends追加属性 }
3.$model->setAppends([]);好像也可以。但我laravel5.4试了下,发现没效果。with(模型)也不知道效果什么样。估计那里不对。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: