2016-11-24 74 views
1

我有一個使用MySQL中的聯結表的多對多關係設置。表格文章通過表格Article_Activity與活動相關。 在模型文章我有一個關係建立這樣在Yii2中創建一個基於ActiveRecord關係的ActiveDataProvider

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

當渲染視圖的一個文章,我想顯示與該條活動的GridView控件。 大多數人似乎這樣做是創建一個ActiveDataProvider並向其中插入一個查詢來獲取相關數據,但是由於我在模型中設置了關係,並且應該有一種方法可以從中獲取數據提供者。

我的問題是:有沒有辦法根據可用於顯示GridView中的所有相關記錄的實例化模型關係獲取yii \ data \ ActiveDataProvider或yii \ db \ Query?

回答

1

實際上,你可以這樣調用:

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

如果直接調用get方法,你得到一個yii\db\ActiveQueryInterface這就是你需要提供的queryActiveDataProvider

當您調用activities屬性(如$article->activities)時,將執行ActiveQueryInterface並從查詢結果中獲取記錄。

+1

問題在於,當您將它稱爲屬性時,Yii2會使查詢得到執行並將實際查詢結果返回給您,而如果直接調用方法,則會獲取查詢對象。 – marche

+0

對不起。只是在你回答時刪除了我的愚蠢評論。您在解決方案中正確寫入了它。謝謝你的時間! –

0

根據你文章的型號,那麼活動的關係,即獲得與您相關的文章

多個活動

正常的dataProvider像

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

回報的ActiveRecord絲毫也有關活動

可以請參閱相關的模型的數據提供程序內

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

然後爲每個這樣你可以得到acyivities

$activities = $model->activities; 

或價值

$my_activity_field = $model->activities->my_activity_field 
+0

謝謝,但我不確定這是否回答我的問題。我想要做的是在我的模型中使用關係設置,以避免在需要數據提供者時編寫冗餘查詢。 –

相關問題