2017-02-09 11 views
0

投稿、コメント、およびユーザーがYii APIにあります。投稿が照会されると、結果は投稿データ、投稿を行ったユーザ、その投稿のコメント、および完全なユーザデータでコメントを作成したユーザでなければなりません。Yiiで条件付きアクティブなレコード関係を作成する方法

コメントテーブルには、created_byフィールドが含まれています。このフィールドは、ユーザーテーブルのuser_idです。これは、IDによるシングルポスト、および任意のコメントを返し

public function actionView($id){ 
    $post = Post::find() 
     ->innerJoinWith('user') 
     ->joinWith('comments') 
     ->where(['{{post}}.id' => $id]) 
     ->asArray() 
     ->one(); 
    return $post; 
} 

は、単一のポストを取得するには、ここではコントローラです。

すべての記事を取得するには:Postモデルで

public function actionIndex(){ 
    $posts = Post::find() 
    ->joinWith('user', $eager) 
    ->joinWith('comments', $eager) 
    ->orderBy('updated_at DESC') 
    ->limit(self::MAX_ROWS) 
    ->asArray() 
    ->all(); 
    return $posts; 
} 

を、コメントの関係は次のように設定されている:

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

だから、これは完全なユーザーをTHREは任意のものである場合はコメントを返しますが、ではありませんコメントした各ユーザーのデータ。だから私は今actionIndex()のみのコメントを持っている投稿を返します....除き、コメントと一緒にユーザーデータを返さないgetComments()

 ->joinWith('user u2','u2.id = comment.created_by') 

にこれを追加しました。

私はthis SO questionを見直しましたが、解決策が見つかりませんでした。コメント付きの投稿にのみ条件付きでjoinWithを含めるにはどうすればよいですか?

答えて

0

私はあなたがjoinWith()の代わりに->with()を使用することをお勧めします:

public function actionIndex() { 
    $posts = Post::find() 
     ->with('user') 
     ->with('comments') 
     ->orderBy('updated_at DESC') 
     ->limit(self::MAX_ROWS) 
     ->asArray() 
     ->all(); 

    return $posts; 
} 

この方法では、あなたはちょうどあなたがすでにPostモデルクラスで宣言されているはずの関係を使用しています。その後、またあなたのPostモデルクラスであなたのcomments関係の宣言に->with()を追加します。

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

この方法では、あなたがすべての投稿、自分のユーザーとユーザーとのコメントを取得する必要があります。

関連する問題