Laravel 訪問器 $appends 忽略的問題

jfaWei發表於2019-05-30

1.當我們使用getxxxxAttribute通過$appends追加xxxx屬性時,可能會遇到這樣的需要:通過模型某個屬性$this->attributes['某個欄位'],計算出 該xxxx屬性。這樣可能會報錯。原因是在獲取select時沒有獲取該欄位(並不是每次都會使用該資料庫欄位),所以$this->attributes取不出該欄位屬性報錯。所以一定要加判斷:

if (!array_key_exists('某個欄位', $this->attributes)) {
            return ' ';
        }else{
            //計算xxxx屬性
        }
  1. 使用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 協議》,轉載必須註明作者和本文連結

相關文章