我在Yii api中有帖子,评论和用户。查询帖子时,结果应该是发布数据,发布帖子的用户以及该帖子的任何评论,以及使用完整用户数据进行评论的用户。
“评论”表格包含created_by
字段,该字段是“用户”表格中的user_id
。
要获得单个帖子,这是控制器:
public function actionView($id){
$post = Post::find()
->innerJoinWith('user')
->joinWith('comments')
->where(['{{post}}.id' => $id])
->asArray()
->one();
return $post;
}
这将返回单个帖子ID和任何评论。
获取所有帖子:
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模型中,Comment关系设置如下:
public function getComments()
{
return $this
->hasMany(Comment::className(), ['object_id' => 'id']);
}
因此,如果thre为any,则返回Comments,但不会返回评论的每个用户的完整用户数据。所以我将其添加到getComments()
->joinWith('user u2','u2.id = comment.created_by')
返回用户数据以及评论,除了......现在actionIndex()
只返回有评论的帖子。
我查看了this SO question,但没有找到解决方案。如何仅对包含评论的帖子有条件地包含joinWith
?
答案 0 :(得分: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');
}
这样,您应该使用自己的用户获取所有帖子,用户和评论。