Отношение многие ко многим в yii2 activedataprovider

У меня есть отношение многие ко многим с тремя таблицами: Category, Product, ProductCategory,
Отношение в Category:

public function getProductCategories()
{
return $this->hasMany(ProductCategory::className(), ['category_id' => 'id']);
}

Отношение в Product:

    public function getProductCategories()
{
return $this->hasMany(ProductCategory::ClassName(), ['product_id' => 'id']);
}

И в ProductCategory

public function getProduct()
{
return $this->hasOne(Product::className(), ['id' => 'product_id']);
}

public function getCategory()
{
return $this->hasOne(Category::className(), ['id' => 'category_id']);
}

В моем контроллере категорий я использовал этот код, чтобы показать нужные мне продукты в соответствии с их категорией (один ко многим):

    $cats = Category::findOne(['slug1'=>$slug1]);
$dataProvider = new ActiveDataProvider([

'query' => $query = Product::find()->where(['category_id' => $cats->id]),
'sort'=>array(
'defaultOrder'=>['id' => SORT_ASC],
),
'pagination' => [
'pageSize' => 9,
],
]);

Итак, вопрос в том, как заставить мой ActiveDataProvider получить в запросе отношение многие ко многим?

0

Решение

Вы можете создать еще два отношения, как это

В категории:

public function getProducts()
{
return $this->hasMany(Product::className(), ['id' =>   'product_id'])->via("productCategories");
}

И в продукте:

public function getCategories()
{
return $this->hasMany(Category::ClassName(), ['id' =>   'category_id'])->via("productCategories");
}

Тогда вы можете использовать это так

$cats = Category::findOne(['slug1'=>$slug1]);
$dataProvider = new ActiveDataProvider([

'query' => $query = $cats->getProducts(),
'sort'=>array(
'defaultOrder'=>['id' => SORT_ASC],
),
'pagination' => [
'pageSize' => 9,
],
]);
0

Другие решения

Других решений пока нет …