我在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中的所有相关记录?
答案 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