【问题标题】:Many-to-many relation in yii2 activedataprovideryii2 activedataprovider中的多对多关系
【发布时间】:2018-03-16 13:23:39
【问题描述】:

我与三个表有多对多关系:CategoryProductProductCategoryCategory中的关系:

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 进入查询多对多关系?

【问题讨论】:

    标签: php activerecord yii2 many-to-many cactivedataprovider


    【解决方案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,
        ],
    ]);
    

    【讨论】:

    • 谢谢!但问题是如何将此关系传递给 $query 以在我看来显示相关产品。非常感谢您的帮助。
    • 对不起,只写`'query' => $cats->getProducts()`
    • 只需添加 $query = Product::find()->where(['category_id' => $cats->id])->joinWith(['Category']);
    • 太奇怪了,现在我有一个错误:无效参数 – yii\base\InvalidParamException app\models\Category 没有名为“productsCategories”的关系。 (这是 Golub 的答案)
    • 至于 Sfili_81 评论,它首先告诉我它区分大小写
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多