2017-10-03 8 views
0

問題:モデルにアクセスするたびに、モデルの熱心な負荷($appendsに設定)がロードされます。同じモデルが要求されている場合も同じですwith()他のモデルの関係。私が期待しているのは、relationからのクエリ中に$appends属性のロードを避けることです。詳細は以下を参照してください。Laravelのリレーションモデルの熱心な負荷を防ぎます

モデル1

<?php 

    Class Shop extends Eloquent{ 

    protected $appends = []; 

    public function products(){ 

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

    } 

    } 

モデル2($内の属性が付加しています)

<?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); 

id2を持つ$shopには にバインドされた製品がロードされ、製品モデルの熱狂的にロードされたdefaultVariant属性は防止する必要があります。親切にお勧めします。ありがとうございました。

+0

を使うのか? – ZeroOne

+0

はい、関係としてロードしています。 – BlackBurn027

答えて

0

あなたがdefaultVariantを非表示にする場合はちょうどあなたが製品に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']); 
+0

最初の方法は無条件でdefaultVariantを隠しています。これを行うと、おそらくそれ以外の場所でmakeVisibleを実行する必要があります。 2番目の方法で、 'with'コールバックの下で隠されたメソッドを実装する方法は? – BlackBurn027

+0

コールバックを使用している場合、select ex:Model :: select( 'column1'、 'column2')を使用する必要があります。 – ZeroOne

+0

Select属性がカスタム属性に影響しないと感じています。先にそれを試みた – BlackBurn027

関連する問題