OgecuT
@OgecuT
веб разработчик

Как реализовать фильтр товаров с EAV?

Есть таблицы categories, products, props, props_value, приведу простой пример:
таблица categories - id, name
таблица products - id, name, price
таблица props - id, name
таблица props_value - prop_id, product_id, value

У каждой категории будет свой набор товаров соответственно разные значения фильтров. Хочу что бы в фильтре в категории выводились только те свойства и значения которые есть у товаров этой категории. Для этого думаю сделать следующую таблицу categories_meta - id, category_id, prop_name, variants(json),
эту табличку будет генерировать воркер допустим 1 раз в день, таким образом я получил все варианты свойст и значений для категории 1 дополнительным запросом в эту таблицу.
Но в текущей реализации мне не понятно как делать диф когда фильтром воспользовались, мне ведь нужно сделать варианты значений которые не подходят уже в выбранные свойства неактивными.
Допустим пользователь выберет свойство "Цвет:красный:зеленый" и мне вернется 20 элементов из продуктов тут мне понятно как сделать, а если результатов будет не 20 а 20000 или больше, это же не разумно делать выборку 20к продуктов делать диф а потом делать еще 1 запрос в базу только уже с пагинацией.
Скажите как эту проблему можно решить, и насколько адекватное такое решения?

Заранее прошу прощения за нечеткое изложения мыслей.
  • Вопрос задан
  • 604 просмотра
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
следующую таблицу categories_meta - id, category_id, prop_name, variants(json)
Зачем? Если делаете денормализацию - нужно очень хорошо представлять себе зачем вы это делаете, и чем придется за это платить.
Немножко непонятно по вашему описанию - свойства привязаны напрямую к продуктам, а по категории невозможно определить список доступных свойств? Как вообще это работает, можно любому продукту любое свойство навесить?

выберет свойство "Цвет:красный:зеленый"
Это как?
Ответ написан
Ваш ответ на вопрос

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

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