在Yii2中基于ActiveRecord Relation创建一个ActiveDataProvider

时间:2016-11-24 15:20:42

标签: yii yii2

我在MySQL中使用联结表进行多对多关系设置。表文章通过表Article_Activity与Activity相关。 在模型文章中,我有一个像这样的关系设置

public function getActivities()
{
    return $this->hasMany(Activity::className(), ['id' => 'activity_id'])
        ->viaTable('article_activity', ['article_id' => 'id']);
}

在为一篇文章呈现视图时,我想显示与该文章相关的所有活动的GridView。 大多数人看来这样做的方法是创建一个ActiveDataProvider并在其中插入一个查询来获取相关数据,但由于我在模型中设置了关系,因此应该有一种从中获取数据提供者的方法。

我的问题是:有没有办法根据实例化的模型关系获取yii \ data \ ActiveDataProvider或yii \ db \ Query,可以用来显示GridView中的所有相关记录?

2 个答案:

答案 0 :(得分:1)

你实际上可以这样称呼它:

$dataProvider = new ActiveDataProvider([
    'query' => $article->getActivities(),
]);

如果您直接调用get方法,则需要yii\db\ActiveQueryInterface query ActiveDataProvider activities

当您调用$article->activities之类的ActiveQueryInterface属性时,return会被执行,您将从查询结果中获取记录。

答案 1 :(得分:0)

根据您的文章模型,您拥有与您的文章相关的多个活动的活动关系

正常的dataProvider,如

  $dataProvider = new ActiveDataProvider([
      'query' => Article::find()->joinWith(['activities'])->
              where(['your_column'=> $your_value]),
  ]);

返回activeRecord whit以及相关活动

您可以参考dataProvider中的相关模型

$models = $dataProvider->models; // this is a collection of model related to the dataProvider  query 
                                 // so the firts model is  $model=models[0] 

然后对于每一个你都可以获得活动

 $activities = $model->activities;

或值

 $my_activity_field = $model->activities->my_activity_field