2016-08-19 13 views
0

残りの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を:私はこのようなinnerJoinWithleftJoinからgetComments()を変更する場合:

public function getComments() 
{ 
    return $this->hasMany(Comment::className(), ['object_id' => 'id'])->innerJoinWith('user u2', 'u2.id = comment.created_by'); 
} 

...正しい形式の出力が得られますが、コメントを含む投稿のみが含まれています。

+0

それは私の視点から、実際に間違っているのです。これを読んでください - http://www.yiiframework.com/doc-2.0/guide-rest-resources.html expand partとextraFieldsについて読んでください。 – ineersa

+0

@ineersa私はそれを読む...それをどのように実装するか分からない。あなたがチェックできるなら、いくつかのコードを追加しました。 – lilbiscuit

+0

コントローラのアクションで 'joinWith()'の代わりに 'with()'を使い、 'extraFields'に' user'と 'comments'を追加し、' expand =あなたの行動にコメントする。 'getComments()'では、 'joinWith()'でデータを読み込もうとします。トリックをする必要があります。 – ineersa

答えて

2

私がチェックしていませんが、あなたは試みることができる:

$post = Post::find() 
     ->joinWith('user') 
     ->joinWith(['comments' => function($q) { 
      $q->joinWith(['user']); 
     }]) 
     ->asArray() 
     ->all(); 
} 
+0

これは、コメントのある投稿のみを返します。 – lilbiscuit

+0

試しましたか? joinWithは左結合を生成するので、コメント付きの投稿のみを返すのは奇妙に思えます。 –

+0

私は試みましたが、アクティブレコード 'joinWith'は内部結合です。[左結合ではありません](http://www.yiiframework.com/doc-2.0/yii-db-activequery.html#relational-query)。 – lilbiscuit

関連する問題