2016-06-21 4 views
0

カスタムアクションでYii2 REST APIを設定しましたが、すべて正常に動作しています。しかし、私がしようとしているのは、外部キーによって設定されたデータベース関係を含むAPIからのデータを返すことです。関係はそこにあり、彼らは実際に正しく働いています。ここでは、コントローラの1例クエリです:コントローラでまだYii2 REST APIリレーショナルデータ返信

$result = \app\models\Person::find()->joinWith('fKCountry', true) 
     ->where(..some condition..)->one(); 

が、私は、例えば、このような何かを呼び出すことができます。

$result->fKCountry->name 

をし、それが関係として適切な名前を表示していましたは働いている。これまでのところ良いですが、APIクライアントから受け取ったreturn $result;の結果を返すと、fkCountryはなくなり、上記の名前にアクセスする方法がありません。残りの唯一のものは、国のテーブルを指し示す外部キーの値です。

私はより多くのコードと情報を提供することができますが、それだけで問題を説明することができます。返されたデータの情報をエンコードしてAPIクライアントにもアクセスできるようにするにはどうすればよいですか?

+0

もっとコードを表示してください – Vitaly

答えて

3

この

public function actionYourAction() { 
    return new ActiveDataProvider([ 
     'query' => Person::find()->with('fKCountry'), // and the where() part, etc. 
    ]); 
} 

のようなセットのそれを、あなたのPersonモデルでextraFields機能がfKCountryが含まれていることを確認してください。

public function extraFields() { 
    return ['fKCountry']; 
} 

をしてURLを呼び出すとき、あなたはあなたがfkCountryデータを含めたいアクションを伝えるためにexpandのparamを追加してください:あなたはまだextraFields機能を実装していない場合は、それを追加します。だから何かのように:

/yourcontroller/your-action?expand=fKCountry 
+0

私は実際にActiveDataProviderを使用していません。ちょうどこの場合は無関係なfind()関数から結果を取得しています。あなたが示唆したようにextraFields関数を追加しました。私がone()関数を呼び出す限り、それはうまくいきます。だから、もし私がPerson :: find() - >( 'fKCountry') - > where(...) - > one(); 'を実行すると、fkCountry情報でレスポンスに余分な配列が得られます。しかし、私が必要なものをall()に変更するとすぐに、余分なデータは再び消えます。なぜこれが起こっているか、それを修正する方法は? – mmvsbg

+0

ActiveDataProviderを追加せずに戻す方法を正確にはわかりませんが、結果が 'toArray()'に渡され、ActiveDataProviderを使わないと思った展開設定が表示されないために消えます。しかし、データプロバイダを追加すると正しく動作しますか? – jagsler

+0

はい、ActiveDataProviderを使用していますが、ActiveDataProviderを使用しているわけではありません。良いヒント。それでも、これを行う簡単な方法があるはずですが、結果をデータを読み込み遅延させないようにするにはコードが多すぎます。私はURLのGETパラメータを取り除きたいです。それでも、質問で尋ねられたことを達成するには、答えを正しいものとしてマークしてください。 – mmvsbg

1

私は上記の問題を解決することができました。 ActiveDataProviderを使用して、私は3つのコードを変更して動作させます。

これは、コントローラに行く:、モデルクラスではまだ

public $field_alias; 

私は修正:モデルで

Model::find() 
->leftJoin('table_to_join', 'table1.id = table_to_join.table1_id') 
->select('table1.*, table_to_join.field_name as field_alias'); 

、私は上記のエイリアスと同じ名前の新しいプロパティを導入fields()メソッド:

public function fields() 
{ 
    $fields = array_merge(parent::fields(), ['field_alias']); 
    return $fields; 
} 

このようにして、私のAPIは私に結合フィールドのデータを提供します。

関連する問題