残りのAPIを持つyiiアプリがあります。私はその投稿のすべてのコメントと投稿の作成者のユーザーオブジェクトを含む投稿オブジェクトを取得したいと思います。 またコメントにコメントを残した各ユーザーのユーザーオブジェクトが必要です。Yii REST API - クエリで複数の結合を使用する
投稿者が1人の投稿と、それぞれのユーザーが多くのコメントを投稿します。
APIリクエストにサービスを提供するポスト・コントローラは、次のようになります。
public function actionIndex(){
$post = Post::find()
->joinWith('user)
->joinWith('comments')
->asArray()
->all();
}
return $post;
次に、ユーザーとコメントのためのモデル:
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'created_by'])->innerJoinWith('profile p1');
}
public function getComments()
{
return $this->hasMany(Comment::className(), ['object_id' => 'id'])->leftJoin('user u2', 'u2.id = comment.created_by');
}
ポストのために、ユーザは罰金を返します。コメントが返されます。しかし、コメントごとに返されるユーザーはありません。私は、getComments()メソッドの左結合がユーザーを引き込むように感じます。何が欠けている?
は、私はこのような何かを取り戻す:
{
"id":"1",
"message":"this is a post",
"user":
[{
"id:11",
"name":"bob smith"
}],
"comments":
[{
"id:21",
"remark":"this is a comment"
}]
}
と私は戻って、この取得したい:
{
"id":"1",
"message":"this is a post",
"user":
[{
"id:11",
"name":"bob smith"
}],
"comments":
[{
"id:21",
"remark":"this is a comment",
"user":
[{
"id:41",
"name":"jane doe"
}]
}]
}
UPDATEを:私はこのようなinnerJoinWith
へleftJoin
からgetComments()
を変更する場合:
public function getComments()
{
return $this->hasMany(Comment::className(), ['object_id' => 'id'])->innerJoinWith('user u2', 'u2.id = comment.created_by');
}
...正しい形式の出力が得られますが、コメントを含む投稿のみが含まれています。
それは私の視点から、実際に間違っているのです。これを読んでください - http://www.yiiframework.com/doc-2.0/guide-rest-resources.html expand partとextraFieldsについて読んでください。 – ineersa
@ineersa私はそれを読む...それをどのように実装するか分からない。あなたがチェックできるなら、いくつかのコードを追加しました。 – lilbiscuit
コントローラのアクションで 'joinWith()'の代わりに 'with()'を使い、 'extraFields'に' user'と 'comments'を追加し、' expand =あなたの行動にコメントする。 'getComments()'では、 'joinWith()'でデータを読み込もうとします。トリックをする必要があります。 – ineersa