Всем доброго времени суток.
Встала задача написать фильтр по параметрам для сайта на базе laravel.
Сделал следующую реализацию:
Таблицы: products, params, values и product_value.
Таблица params связана с values и values связана с products.
Каждый параметр имеет несколько значений и каждый продукт имеет несколько значений.
Связь реализована с помощью функций eloquent hasMany и belongsToMany.
Выборка происходит следующим образом:
В блоке параметров с помощью foreach выводятся значения для каждого параметра. Пользователь выбирает параметры, эти данные отправляются на сервер в виде массива.
Дальше происходит обход этого массива посредством foreach. На каждую итерацию происходит выборка записей из БД, которые имеют значение параметра, записанного в текущий элемент массива.
Таким образом получаем другой, уже двумерный, массив с массивами идентификаторов подходящих продуктов. Потом с помощью функции схождения массивов выбираются продукты подходящие по всем параметрам. Они впоследствие и выводятся пользователю.
Вопрос заключается в следующем. Имеется ли более легкая реализация в плане нагрузки на сервер и можно ли сделать это как-нибудь более просто? Хоть мой вариант вроде бы максимально универсальный, но, что-то мне подсказывает, не рациональный.
Если я правильно понимаю у вас с фронтенда приходит массив значений из таблицы values.
Вариант 1: через Has Many Through не получить products которые с ними связаны, а потом не пересечь коллекции?
Вариант 2: сделать Scope который по массиву values получает все товары у которых такие значения.
Возможно я не правильно понимаю и у нас с фронтенда приходит верхнее и нижнее значения для каждого из params - тогда только вариант 2.