Есть фильтры товаров:
Они состоят из двух таблиц: 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`
Код: Выделить всё
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`