Отношение «многие ко многим» в 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 запрашивать отношение «многие ко многим»?


person andrew    schedule 16.03.2018    source источник


Ответы (1)


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

В категории:

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,
    ],
]);
person Golub    schedule 16.03.2018
comment
Спасибо! Но вопрос заключался в том, как передать это отношение в запрос $, чтобы показать относительные продукты, на мой взгляд. Я был бы очень признателен за вашу помощь. - person andrew; 16.03.2018
comment
Извините, просто напишите ` 'query' =› $cats-›getProducts()` - person Golub; 16.03.2018
comment
Просто добавьте $query = Product::find()-›where(['category_id' =› $cats-›id])-›joinWith(['Category']); - person Sfili_81; 16.03.2018
comment
так странно, теперь у меня ошибка: Invalid Parameter — yii\base\InvalidParamException app\models\Category не имеет отношения с именем productsCategories. (это ответ Голубу) - person andrew; 16.03.2018
comment
что касается комментария Sfili_81, он сначала сказал мне, что он чувствителен к регистру, поэтому я просто заменил «Категория» на «категория». Теперь он отображает мою страницу, но не показывает товары в этих категориях :( - person andrew; 16.03.2018
comment
фу! Я нашел ошибку. В коде Голуба есть via(productsCategories), а должно быть via(productCategories) Большое спасибо! - person andrew; 16.03.2018
comment
@andrew извините за опечатку, я рад, что смог помочь. - person Golub; 16.03.2018