Фильтры для товаров и кол-во товаров в фильтре

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Фильтры для товаров и кол-во товаров в фильтре

Сообщение webplus »

Здравствуйте!
Есть фильтры товаров:
Изображение
Они состоят из двух таблиц: filters - это названия фильтров и id их. И таблица связей product_filter - это связь filter_id с product_id
вот таблица product_filter с данными
Изображение
У меня неправильно подсчитывается количество продуктов в фильтре.
Количество в блоках фильтра должно меняться в зависимости какой фильтр мы выбрали. Т.е. если у выбранного фильтра есть продукт и этот продукт имеет другие фильтры то количество должно быть верное в каждом фильтре.

Код: Выделить всё

        //$filter_ids например $filter_ids[] = 6;
        if(count($filter_ids)) {
            foreach (Filter::find()->where(['id' => $filter_ids])->all() as $model) {
                $filters[$model->parent_id][] = $model->id;
            }
        }
        $models = Filter::find()->where('category_id = :category_id AND parent_id IS NULL', [':category_id' => $category_id])->all();
        $i = 0;
        foreach ($models as $model) {
            $out[$i]['parent'] = $model;
            $query = Filter::find()->select([Filter::tableName().'.*', 'count(product_filter.filter_id) as count_product'])
                ->joinWith(['productFilter' => function (ActiveQuery $query) use ($filters, $model) {
                    foreach ($filters as $parent_id => $filter) {
                        if ($parent_id != $model->id) {
                            return $query->andOnCondition(['IN', 'product_filter.filter_id', $filter]);
                        }
                    }
                }])
                ->where('filter.category_id = :category_id AND filter.parent_id = :parent_id', [':category_id' => $category_id, ':parent_id' => $model->id])
                ->groupBy('product_filter.filter_id');

            $out[$i]['filters'] = $query->all();
            $i++;
        }
вот как должно быть: Изображение

вот из дебага sql запрос для первого блока фильтров:

Код: Выделить всё

SELECT `filter`.*, count(product_filter.filter_id) AS `count_product` FROM `filter`
 LEFT JOIN `product_filter` ON (`filter`.`id` = `product_filter`.`filter_id`) AND (`product_filter`.`filter_id`=6) 
 WHERE filter.category_id = 16 AND filter.parent_id = 2 
 GROUP BY `product_filter`.`filter_id`
а вот запрос для второго блока фильтров, он не содержит AND (`product_filter`.`filter_id`=6) - условия для этого есть в php. Т.е. мы в блоке в котором выбираем галочками количество не меняем

Код: Выделить всё

SELECT `filter`.*, count(product_filter.filter_id) AS `count_product` FROM `filter` 
LEFT JOIN `product_filter` ON `filter`.`id` = `product_filter`.`filter_id` 
WHERE filter.category_id = 16 AND filter.parent_id = 4
 GROUP BY `product_filter`.`filter_id`
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Фильтры для товаров и кол-во товаров в фильтре

Сообщение yiiliveext »

Во-первых, сделайте нормальный пример, а не вот это вот все cssssssss etc.
Во-вторых опишите структуру всех таблиц, которые участвуют в фильтре, а то приходится догадываться, например, что такое category_id и с какой таблицей оно связано.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Фильтры для товаров и кол-во товаров в фильтре

Сообщение webplus »

yiiliveext писал(а): 2019.12.17, 00:17 Во-первых, сделайте нормальный пример, а не вот это вот все cssssssss etc.
Здравствуйте!
Вот фильтры: Изображение
Вот таблица filters их в базе:
Изображение

А вот таблица product_filter:
Изображение

Я вроде бы уже и построил верный запрос - вроде смотрю правильно работает. Но может можно более правильно сделать.
вот мой код:
На первом скрине у меня выбран $filter_ids[] = 6;

Код: Выделить всё

        if (count($filter_ids)) {
            foreach (Filter::find()->where(['id' => $filter_ids])->all() as $model) {
                $filters[$model->parent_id][] = $model->id;
            }
        }
        $models = Filter::find()->where('category_id = :category_id AND parent_id IS NULL', [':category_id' => $category_id])->all();
        $i = 0;
        foreach ($models as $model) {
            $out[$i]['parent'] = $model;
            $query = Filter::find()->select([Filter::tableName() . '.*', 'count(pf1.filter_id) as count_product'])
                ->leftJoin(ProductFilter::tableName() . ' pf1', 'pf1.filter_id=filter.id')
                ->where('filter.category_id = :category_id AND filter.parent_id = :parent_id', [':category_id' => $category_id, ':parent_id' => $model->id])
                ->groupBy('pf1.filter_id');
            foreach ($filters as $parent_id => $filter) {
                if ($parent_id != $model->id) {
                    $query->leftJoin(ProductFilter::tableName() . ' pf2', 'pf1.product_id=pf2.product_id');
                    $query->andOnCondition(['IN', 'pf2.filter_id', $filter]);
                }
            }

            $out[$i]['filters'] = $query->all();
            $i++;
        }
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Фильтры для товаров и кол-во товаров в фильтре

Сообщение yiiliveext »

Подход к построению фильтров, конечно, странный, но заслуживает право на жизнь. Наверное.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Фильтры для товаров и кол-во товаров в фильтре

Сообщение webplus »

yiiliveext писал(а): 2019.12.17, 16:07 Подход к построению фильтров, конечно, странный, но заслуживает право на жизнь. Наверное.
А кокой вариант фильтров еще бывает для интернет магазина? Вроде все интернет магазины используют подобные фильтры, как у меня в первом скрине (отмечать галочками нужные фильтры)
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Фильтры для товаров и кол-во товаров в фильтре

Сообщение yiiliveext »

webplus писал(а): 2019.12.17, 19:39
yiiliveext писал(а): 2019.12.17, 16:07 Подход к построению фильтров, конечно, странный, но заслуживает право на жизнь. Наверное.
А кокой вариант фильтров еще бывает для интернет магазина? Вроде все интернет магазины используют подобные фильтры, как у меня в первом скрине (отмечать галочками нужные фильтры)
Я не о том, я о хранении фильтров и их значений в одной таблице через adjacency list.
В интернет-магазинах обычно фильтры делают на основании характеристик товаров и хранятся они немного по-другому.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Фильтры для товаров и кол-во товаров в фильтре

Сообщение webplus »

yiiliveext писал(а): 2019.12.17, 20:15 В интернет-магазинах обычно фильтры делают на основании характеристик товаров и хранятся они немного по-другому.
Я вот бэкенд одного магазина нашел https://github.com/pistol88/yii2-shop в нем есть фильтры вот скрин
Изображение
Но в нем нет разделения этих фильтров на группы, например как у меня группа Размер и группа Цвет а в них фильтры которые галочками выбираются.
Как я на фронте без групп эти опции/фильтры выведу для сортировки товаров. - только без групп наверно - общим списком.
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Фильтры для товаров и кол-во товаров в фильтре

Сообщение yiiliveext »

Размер и Цвет - это и есть фильтры. А XXL, Белый - это их значения. Фильтруется по парам Фильтр - Значение/Набор значений.
Ответить