2016-11-24 3 views
1

MySQLのジャンクションテーブルを使用して多対多リレーションシップを設定しています。表アーティクルはアクティビティテーブルArticle_Activityに関連しています。私はその記事に関連するすべての活動のGridViewのを表示したい1条のビューをレンダリングするときにモデルの記事で 私はこのYii2でActiveRecord関係に基づいてActiveDataProviderを作成

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

のような関係を設定しています。 ほとんどの人がこれに見える方法は、ActiveDataProviderを作成し、関連するデータをフェッチするクエリを挿入することですが、モデルにリレーション設定があるので少し冗長であり、そこからデータプロバイダを取得する方法が必要です。

私の質問は:GridViewのすべての関連レコードを表示するために使用できるインスタンス化されたモデルの関係に基づいてyii \ data \ ActiveDataProviderまたはyii \ db \ Queryを取得する方法はありますか?

答えて

1

を得ることができますが、実際にこのようにそれを呼び出すことができますにqueryとして提供する必要があるものであるyii\db\ActiveQueryInterfaceを取得します。

activitiesという属性を$article->activitiesと呼び出すと、ActiveQueryInterfaceが実行され、クエリ結果からレコードが取得されます。

+1

属性のように呼び出すと、Yii2によってクエリが実行され、実際のクエリ結果が返されます。メソッドを直接呼び出すと、クエリオブジェクトが取得されます。 – marche

+0

申し訳ありません。あなたが答えたときに私の愚かなコメントを削除しました。あなたはあなたの解決策でそれを正しく書きました。御時間ありがとうございます! –

0

あなたができる関連の活動にも

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

リターンActiveRecordの聖霊降臨祭のような通常のdataProviderをあなたに関連する複数のアクティビティを得る活動の関係を持っているあなたに基づいて記事モデルdataProvider内の関連モデルを参照してください。

$models = $dataProvider->models; // this is a collection of model related to the dataProvider query 
           // so the firts model is $model=models[0] 
あなたが直接あなたのgetメソッドを呼び出した場合

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

これのそれぞれについて、あなたはacyivities

$activities = $model->activities; 

または値

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

ありがとうございますが、これが私の質問に答えるかどうかわかりません。私がしたいことは、データプロバイダが必要なときに冗長クエリを書くのを避けるために、私のモデルで関係設定を使うことです。 –

関連する問題