Есть таблица категорий, товаров и промежуточная таблицы.
В модели категорий родительские и дочерние категории, связаны через parent_id. Так же имеется связь на промежуточную таблицу, связь через category_id.
Код: Выделить всё
public function getParent()
{
return $this->hasOne(Catalog::class, ['id' => 'parent_id']);
}
public function getCategories()
{
return $this->hasMany(Catalog::class, ['parent_id' => 'id']);
}
public function getProducts()
{
return $this->hasMany(Products::class,['id' => 'product_id'])->viaTable('{{%products_categories}}', ['category_id' => 'id']);
}
Код: Выделить всё
public function getCategoriesProduct()
{
return $this->hasMany(Catalog::class, ['id' => 'category_id'])->with('parent')->viaTable('{{%products_categories}}', ['product_id' => 'id']);
}
Теперь мне потребовалось вывести родительские категории и получить товары, которые связаны с дочерними категориями текущей родительской категории.
Например, есть родительские категории "Игровые комплексы" и "Игрушки". У этих родительский категорий есть дочерние "Детские горки", "Детские домики" для первой и "Мягкие игрушки", "Умные игрушки" для второй. Теперь на главной мне необходимо вывести товары в таком виде.
Такой запрос позволяет вывести мне родительские категории у которых есть дочерние категории с привязанными товарами.ИГРОВЫЙ КОМПЛЕКСЫ
Детские горки, Детские домики
ИГРУШКИ
Мягкие игрушки, Умные игрушки
Код: Выделить всё
$query = Catalog::find()
->from(['catalog' => Catalog::tableName()])
->where(['catalog.status' => Catalog::STATUS_ACTIVE, 'catalog.parent_id' => null])
->with(['categories', 'products'])
->joinWith([
'categories' => function(ActiveQuery $query){
$query->from(['category' => Catalog::tableName()]);
}
])
Код: Выделить всё
SELECT COUNT(*) FROM `catalog` `catalog`
LEFT JOIN `catalog` `category` ON `catalog`.`id` = `category`.`parent_id`
WHERE (`catalog`.`status`=1) AND (`catalog`.`parent_id` IS NULL)
Код: Выделить всё
SELECT * FROM `products_categories` WHERE `category_id` IN (1, 2, 3, 14, 19)
Код: Выделить всё
$query = Catalog::find()
->from(['catalog' => Catalog::tableName()])
->where(['catalog.status' => Catalog::STATUS_ACTIVE, 'catalog.parent_id' => null])
->with(['categories', 'products'])
->joinWith([
'categories' => function(ActiveQuery $query){
$query->from(['category' => Catalog::tableName()]);
}
])
->joinWith([
'products' => function(ActiveQuery $query){
$query->from(['product' => Products::tableName()])->where(['product.status' => Products::STATUS_ACTIVE]);
}
])
Код: Выделить всё
SELECT COUNT(*) FROM `catalog` `catalog`
LEFT JOIN `catalog` `category` ON `catalog`.`id` = `category`.`parent_id`
LEFT JOIN `products_categories` ON `catalog`.`id` = `products_categories`.`category_id`
LEFT JOIN `products` `product` ON `products_categories`.`product_id` = `product`.`id`
WHERE ((`catalog`.`status`=1) AND (`catalog`.`parent_id` IS NULL)) AND (`product`.`status`=2)
Подскажите, как изменить запрос, чтобы подтягивались товары с учётом limit(4) для каждой родительской категории?