Как вы оптимальнее фильтруете данные по многим параметрам?

Сразу скажу что решение надо которое могу использовать в shared hosting'е, то есть обычных PHP & MySQL (без Radis и.т.д.)!

Делаю интернет-магазин, как вы знаете товары надо фильтровать по многим параметрам (ну для удобство пользователя). Например для 3-ох параметров (color, size, brand) мое решение такое (ну просто ужасное):
if (isset($color) && isset($size) && isset($brand)) {
    // where color = $color and size = $size and brand = $brand
} elseif (isset($color) && isset($size) && ! isset($brand)) {
    // where color = $color and size = $size
} elseif (isset($size) && isset($brand) && ! isset($color)) {
    // where size = $size and brand = $brand
} elseif (isset($color) && isset($brand) && ! isset($size)) {
    // where color = $color and brand = $brand
} elseif (isset($color) && ! isset($size) && ! isset($brand)) {
    // where color = $color
} elseif (isset($size) && ! isset($color) && ! isset($brand)) {
    // where size = $size
} elseif (isset($brand) && ! isset($color) && ! isset($size)) {
    // where brand = $brand
}  else {
    // здесь по умолчанию
}

А теперь представьте что надо фильтровать товары по 10-15 параметрам :) Аж голова кружится...ку
Вот и хочется все это оптимизировать (узнать про практичное решение). Уверен многие сталкивались этой проблемой, поделитесь решением.

В частности решение нужно для Laravel 5.1. Но обычное PHP & SQL тоже будет танком для меня :)
  • Вопрос задан
  • 530 просмотров
Решения вопроса 2
AmdY
@AmdY
PHP и прочие вебштучки
А в чём проблема, зачем такие сложные ифы, в простом варианте можно обойтись простми
if ($color = \Input::get('color')) {
   $model->where('color', $color);
}
if ($size = \Input::get('color')) {
   $model->where('size', $size);
}
//....

Можно оптимизировать засунув фуильтры в массив
foreach($filters as $filter) {
     if ($value = \Input::get($filter)) {
        $model->where($filter, $value);
    }
}

и т.д.
Если у вас нормальная база с EAV и фасетами, то полезно будет конструкция ::has
Почитайте доку по фреймворку, чтобы не было геммороя из-за незнания работы его конструкций, так понимаю про то, что where складыватся в and вы похоже не знали.
Ответ написан
DJZT
@DJZT
Laravel - code for you
Сделайте себе конструктор BD запроса, который будет собирать вам запрос по кусочкам. Когда вызываете метод where($field, $value) - то он генерирует строку для блока запроса SQL WHERE.
$sql .= "`field` = 'value'"
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
denisandroid
@denisandroid
BASH ,PHP , MYSQL, C++, JAVA . (PHP, JAVA,MYSQL)
Ух, ивправду скрипт тяжеленький:)
Так подсказать не могу, но еслиб я использовал Mysql, то обычного WHERE ему хватилобы.
Ответ написан
Ваш ответ на вопрос

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

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