Доброй ночи! Не совсем понимаю, как реализовать следующее. Есть категории, есть товары, есть характеристики, которые подвязаны к товарам. Мне нужно сгрупировать товары в разных категориях, по разным характеристикам.
Пользователь, добавляя категорию, выбирает по какой характеристе будет идти группировка.
Таблица выглядит следующим образом
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 внутри таблицы с категоиями. То все товары группируються следующим образом
Такой результат я получаю, видоизменив контроллер следующим образом. Значения 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 товаров.
Быть может я изчишне с базой данных намудрил?
Если можно, помогите с решением задачи и еще больше буду рад, если растолкуете мне все, чтобы я понимал именно тонкости. Последнее, чего мне хочеться - это копи паст, просто потому, что - это путь в никуда, но иногда только это и остаеться. В любом случае, я буду благодарен за любого рода помощь и советы!
Спасибо!