2017-02-09 9 views
0

У меня есть сообщение, комментарий и пользователь в Yii api. Когда запрашивается сообщение, результатом должны быть данные Post, Пользователь, который сделал сообщение, и любые комментарии для этого сообщения, а также Пользователь, который сделал комментарий с полными данными пользователя.Как сделать условное отношение активной записи в Yii

В таблице комментариев содержится поле created_by, которое является user_id в таблице пользователей.

Чтобы получить один пост, вот контроллер:

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

В модели Post, отношения Комментарий устанавливается следующим образом:

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

Так что это возвращает Комментарии, если Автошоу имеются, но не полный User данные для каждого пользователя, который прокомментировал. Поэтому я добавил это getComments()

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

Что делает возвращать пользовательские данные вместе с комментарием, КРОМЕ .... Теперь actionIndex() возвращает только сообщения, которые имеют комментарии.

Я рассмотрел this SO question, но не нашел решение. Как я могу условно включить joinWith только для сообщений с комментариями?

ответ

0

Я бы порекомендовал вам использовать ->with() вместо joinWith():

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

    return $posts; 
} 

Таким образом, вы просто использовать отношения вы уже должны были объявленными в вашем Post классе модели. После этого добавить ->with() к вашей декларации comments отношений в вашем Post классе модели:

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

Таким образом, вы должны получить все сообщения, пользователь и комментарии со своими собственными пользователями.