Laravel GroupBY?

Доброй ночи! Не совсем понимаю, как реализовать следующее. Есть категории, есть товары, есть характеристики, которые подвязаны к товарам. Мне нужно сгрупировать товары в разных категориях, по разным характеристикам.
Пользователь, добавляя категорию, выбирает по какой характеристе будет идти группировка.
Таблица выглядит следующим образом

categories:

id
title
parent
group_by (id характеристики)

Соответственно в таблице с продуктами есть поле с категорией.

products:

id
title
category
...

Так же есть таблица с характеристиками и значениями характеристик

specifications:

id,
title

specifications_values:

id,
value,
specification_id

И если, допустим, мне нужно было бы группировать значения по какому либо полю внутри таблицы с продуктами. Без проблем, там все понятно. Но я совсем не понимаю, как мне группировать товары по значениям из таблицы specifications_values, которые привязаны к таблице specifications, в свою очерь id которой находиться в поле group_by, таблицы с категорями.

Когда я объявляю "отношения" товаров с категорией и пробую сгруппировать по значение из поля group_by, то все хорошо.

Вот так выглядит моя модель
public function relatedCategory()
    {
        return $this->hasOne(ModelNomenclature::class, 'id', 'category');
    }

    public function getProducts()
    {
        return self::with('relatedCategory')->latest()->get();
    }


А вот контроллер

public function index()
    {
        $data = [
            'nomenclature' => $this->nomenclature->selfList(),
            'products' => $this->products->getProducts()
        ];

        dd( $data['products']->groupBy('relatedCategory.group_by') );
    }

Ное сли я добавлю еще одно "отношение" и выберу все значения из таблицы specifications_values, в которых поле specification_id равно значению group_by внутри таблицы с категоиями. То все товары группируються следующим образом

Скрин
5cbbafb3d2911709086054.png


Такой результат я получаю, видоизменив контроллер следующим образом. Значения relatedSpecsValues подгружаються корректно.
Модель:
public function getProducts()
    {
        return self::with('relatedCategory.relatedSpecsValues')->latest()->get();
    }


Контроллер :
public function index()
    {
        $data = [
            'nomenclature' => $this->nomenclature->selfList(),
            'products' => $this->products->getProducts()
        ];

        dd($data['products']->groupBy('relatedCategory.relatedSpecsValues.value'));
    }


К тому же, у меня на странице с товарами, при загрузке страницы, выводяться только категории и подкатегории.
При нажатии на подкатегорию, у меня с помощью ajax подгружаеться список товаров. Опять же, подгружаеться не полность, ибо реализован так называемый infinity scroll. И если просто подгружать товары - нет проблем, то как быть с подгрузкой сгрупированных значений? По скольку в одной категории может быть более 1к товаров, мне нужно чтобы страница грузилась быстро. Выходит, мне нужно, асинхронно подгрузить все значения по которым будет идти группировка, отрисовать их и после нажатия на какое либо значение подгрузить и отрисовать N товаров, а потом при прокручивании страницы вниз, подгрузить еще N товаров.

Быть может я изчишне с базой данных намудрил?

Если можно, помогите с решением задачи и еще больше буду рад, если растолкуете мне все, чтобы я понимал именно тонкости. Последнее, чего мне хочеться - это копи паст, просто потому, что - это путь в никуда, но иногда только это и остаеться. В любом случае, я буду благодарен за любого рода помощь и советы!
Спасибо!
  • Вопрос задан
  • 235 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ART_CORP
Hard work
Producr::skip($skip)->take($limit)->get()
При прокручивании меняете значение $skip
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы