在Laravel中防止关系模型的急切负荷

时间:2017-10-03 09:09:05

标签: php laravel laravel-5.3 laravel-eloquent

问题:只要访问该模型,就会加载模型的预先加载(在$appends中设置),如果通过另一个模型的with()方法请求相同的模型,则也是如此。关系。我期待的是避免在查询关系时加载$appends属性。请参阅以下内容以获取更多信息。

模型1

<?php

   Class Shop extends Eloquent{

     protected $appends = [];

     public function products(){

        return $this->hasMany(App\Product::class);

     }

   }

模型2(在$ appends中有一个属性)

  <?php

   Class Product extends Eloquent{

     protected $appends = ['defaultVariant'];

     public function variants(){

        return $this->hasMany(App\Variant::class);

     }

     public function getDefaultVariantAttribute(){

     //do something to check default variant

     }

   }
  <?php

  Class Variant extends Eloquent{

     protected $appends = ['var1', 'var2', 'var3'];


  }
  <?php

  //imagine a query like below

     $shop = App\Shop::with('products')->find(2);

     dd($shop->products);

现在{id} 2的$shop将加载绑定的产品 以及产品模型的急切加载的defaultVariant属性,这是需要防止的。请建议。谢谢。

1 个答案:

答案 0 :(得分:0)

如果你想隐藏defaultVariant,只需使用隐藏的

 Class Product extends Eloquent{

     protected $appends = ['defaultVariant'];
     protected $hidden = ['defaultVariant'];

     public function variants(){
        return $this->hasMany(App\Variant::class);
     }

     public function getDefaultVariantAttribute(){    
     }
   }

或以编程方式

$this->hidden(['defaultVariant']);