2016-12-19 5 views
0

私はYii2フレームワークを使用しているプロジェクトでアクティブレコードのリレーショナルデータ機能を使用しようとしています。私は2つのテーブル(「投稿」と「結果」)の間に宣言された多対多の関係を持っています。私はデータにアクセスしようとすると、それもこのように動作します:私は3番目のテーブルが関与する必要がある場合にYii2のアクティブレコード(PHP):関係を持つ他のDBテーブルへのアクセス

$post = Post::findOne(id); 
$result= $post->result; 

私の問題がアップします。私は "結果"テーブルと別のテーブル( "天気")の間に多対1の関係を(私のモデルで)宣言しました。 ResultControllerで

:WeatherControllerで

public function getWeather() { 
    return $this -> hasOne(\modules\custom\models\Weather::className(), ['id' => 'weather_id']); 
} 

public function getResult() { 
    return $this -> hasMany(\modules\custom\models\Result::className(), ['cube_id' => 'id']); 
} 

上記mentionnedのように、私は "ポスト" と "結果" のデータにアクセスしたら、それはまたからのデータにアクセスすることが可能です関係を介して「結果」にリンクされている「天気」?そうでない場合は、3番目のテーブルからデータを取得する最良の方法は何ですか?

+0

http://www.yiiframework.com/doc-2.0/yii-db-activerelationtrait.html#via()-detailにアクセスするにはvia()を使用してください – SiZE

答えて

0

投稿モデルをクエリのプライマリとして使用している場合、投稿モデルでリレーションシップを作成する必要があります。 2つのシナリオがあります:ポストモデル結果と気象モデルとの関係を持っているなど、Postモデルは、結果だけで関係を持っており、結果は天気と関係を持っている場合 は1.あなたはこの

$post = Post::find()->joinWith(['result','weather'])->andWhere(['id'=>$id])->one; 

2のようなクエリを記述する必要がありクエリは次のようになります。

$post = Post::find()->joinWith(['result','result.weather'])->andWhere(['id'=>$id])->one; 

同じクエリ内で複数のリレーションを追加できます。

+0

「結果」と「天気"異なる変数で、私は最初に" joinWith "を避けてみました。私はちょうど私が投稿した解決策を見つけました。 – rubz

+0

配列に結果が得られたら、それを解析して結果として保存し、別の変数に天気予報できます。 –

0

私は何かを考え出しました。私はこのようなものをもっと得ようとしていました:

$post = Post::findOne(id); 
$result = $post->result; 
$weather = $result->weather; 

しかし、それはうまくいかないでしょう。私は、2行目がオブジェクトの配列を$ result変数に返すので、3行目は機能しませんでした。それを行うには良い方法があるかどうか、私は知りませんが、私はこの方法を行ってきました:

$weather= []; 
for ($i = 0; $i < count($result); $i++) { 
    array_push($weather, $result[$i]->weather); 
} 

それは誰もがそれを行うためのクリーンな方法を知っている、私に知らせて!

関連する問題