2017-02-07 10 views
0

LaravelのEagerローディングを使用して、店舗のN + 1クエリの問題を解決しようとしています。集計関数を使用したEager Loading

-A製品hasManyのバリエーションは、各バリエーションは、その価格と一緒に価格に

-Aストアページの一覧すべての製品を提供しています。アクティブなメンバーは割引価格を参照して、price()とregularPrice()を参照してください。

- scopeRegularPrice()のmin()とmax()が適切に読み込まれていないと考えています。

積極的な読み込みに集計関数を使用する場合のベストプラクティスはありますか?

製品モデル enter image description here

コントローラ enter image description here

ブレード出力(Blackfireデバッグツール経由) enter image description here クエリ結果

enter image description here

答えて

0

あなたのローカルスコープが帰国されるべきです 何か。したがって、追加する

public function scopeRegularPrice() { 
    ... 
    return 'something' 
} 

すでに何かを返す場合は、ごめんなさい。私はあなたのコードでreturn文を見ることができませんでした。

+0

返された値で完全な関数をアップロードしました。混乱を避けるため、私は早めに切り捨てました。 (scopeRegularPrice()内でmin()とmax()を呼び出しているため問題が発生していると思います) – ryank

+0

'scopeRegularPrice()は何を返していますか?配列?比較するときにも 'if($ product-> price!= $ product-> regularPrice())'を実行してみてください。価格にかっこはありません。 'price'が関数であり、属性でない限り。 – EddyTheDove

0

スコープはQueryBuilderを返します。

製品モデルの属性として通常の価格にする方が良いかもしれません。

価格順に並べ替えるようにしました。 このメソッドを製品クラスに追加します。

public function getRegularPriceAttribute() { 

     $variations = $this->variations; 
     // Get the live variations by where on collection , not DB query. 
     $liveVaries = $variations->where('live', true)->all(); 
     // the first is the cheapest because you the variations relation should be orderBy('price') 
     if (! empty($liveVaries)) return [first($liveVaries)->price, last($liveVaries)->price]; 

     return [first($variations)->price, last($variations)->price];} 
関連する問題