У меня есть сообщение, комментарий и пользователь в 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
только для сообщений с комментариями?