wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.

Конструкция ->with() вызывает утечку памяти в Laravel?

Здравствуйте.
Имеется такой запрос:
$products->joinRelations('categories')->with('products')->whereNotNull('category_id')->groupBy('category_id')->getCache(['product_categories.*']);

Результаты его работы таковы:
87f48c7d76fa410ba060f407b2f35a7b.png

Соответственно, без конструкции ->with('products')
e2e33ffb95794b2aa42ae256cedd11ae.png

Памяти жрет явно меньше (но все равно с избытком), но и запросов больше (так как при каждом выводе products выполняется новый запрос).

Нужен совет, как бы это дело лучше оптимизировать?
Не прошу готового кода, подтолкните пожалуйста в нужную сторону.
  • Вопрос задан
  • 441 просмотр
Решения вопроса 2
wielski
@wielski Автор вопроса
✔ Совет: Вам помогли? Отметьте ответы решением.
Переписал таким образом:

public function scopeGetCategories($query){
      $categories = clone $query;
      return $categories->joinRelations('categories')
            ->selectRaw('*, count(`product_category_values`.`product_id`) as products_count')
            ->whereNotNull('category_id')->groupBy('category_id')
            ->getCache(['product_categories.*']);
    }


Для определения количества товаров в категории использовал selectRaw.
Соответственно, вместо подсчета связей сразу беру значение products_count.

Результат, как говорится, на лицо. Потребление памяти в районе нормы.
5f9cb85d591641fd934c318dd0708e6d.png
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
нет никакой утечки, просто вы пропросили загрузить вместе с категориями и продукты (через join), собственно объектов будет побольше.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы