基于Yii2中的ActiveRecord关系创建ActiveDataProvider

基于Yii2中的ActiveRecord关系创建ActiveDataProvider,yii,yii2,Yii,Yii2,我在MySQL中使用连接表设置了多对多关系。表项目通过表项目活动与活动相关。 在本文范本中,我有一个这样的关系设置 public function getActivities() { return $this->hasMany(Activity::className(), ['id' => 'activity_id']) ->viaTable('article_activity', ['article_id' => 'id']); } 当呈现一篇

我在MySQL中使用连接表设置了多对多关系。表项目通过表项目活动与活动相关。 在本文范本中,我有一个这样的关系设置

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中显示所有相关记录?

基于您的文章模型,您有一种活动关系,可以获取与您的文章相关的多个活动

一个普通的数据提供者,比如

  $dataProvider = new ActiveDataProvider([
      'query' => Article::find()->joinWith(['activities'])->
              where(['your_column'=> $your_value]),
  ]);
返回activeRecord以及相关活动

您可以参考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

你可以这样称呼它:

$dataProvider = new ActiveDataProvider([
    'query' => $article->getActivities(),
]);
如果直接调用get方法,则会得到一个
yii\db\ActiveQueryInterface
,这是您需要作为
query
提供给
ActiveDataProvider
的接口


当您调用
activities
属性,如
$article->activities
时,将执行
ActiveQueryInterface
,并从查询结果中获取记录。

谢谢,但我不确定这是否回答了我的问题。我想做的是在我的模型中使用关系设置,以避免在需要数据提供程序时编写冗余查询。问题是,当您像属性一样调用它时,Yii2使其执行查询并将实际查询结果返回给您,而如果您直接调用该方法,则会得到查询对象。对不起。。就在你回答的时候删除了我愚蠢的评论。您在解决方案中正确地写入了它。谢谢你的时间!这仍然正确吗?在2.0.36中尝试时,我遇到一个错误:
调用未知方法:yii\db\ActiveQuery::getModels()