2017-02-07 5 views
0

Я пытаюсь использовать загрузку Laravel для загрузки проблемы N + 1 в моем магазине.Eager Loading with Aggregate Functions

-A Продукт hasMany вариации, каждое изменение имеет свою цену

-A магазин страница содержит список всех продуктов вместе с их ценами. Активные участники видят скидку на цены, а затем цены() и regularPrice().

-I верю, что min() и max() в scopeRegularPrice() не загружаются должным образом.

Есть ли наилучшая практика для использования агрегатных функций для активной загрузки?

Модель продукта enter image description here

Контроллер enter image description here

клинка Выход enter image description here Результаты запроса (через Blackfire Debugging Tool)

enter image description here

ответ

0

Ваш местный охват должен возвращаться что нибудь. Поэтому добавьте

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

Если вы уже что-то возвращаете, то извините. Я не мог видеть никакой инструкции возврата в вашем коде.

+0

Я загрузил полную функцию с возвращаемым значением. Я отключил его раньше, чтобы избежать путаницы. (Я думаю, проблема возникает из-за того, что я вызываю min() и max() в пределах scopeRegularPrice()) – ryank

+0

Что такое 'scopeRegularPrice()' return? массив? также, когда вы сравниваете, попробуйте сделать '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];}