我有一个带有休息api的yii应用程序。我希望获得一个帖子对象,其中包含该帖子的所有评论以及帖子创建者的用户对象。 同样在评论中,我想要留下评论的每个用户的用户对象。
所以一篇帖子中有帖子的用户和很多评论,每个帖子都有用户。
服务于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"
}]
}]
}
更新:如果我将getComments()
从leftJoin
更改为innerJoinWith
,请执行以下操作:
public function getComments()
{
return $this->hasMany(Comment::className(), ['object_id' => 'id'])->innerJoinWith('user u2', 'u2.id = comment.created_by');
}
...然后我得到格式正确的输出但是它只包含包含评论的帖子。
答案 0 :(得分:2)
我没有检查过,但您可以尝试:
$post = Post::find()
->joinWith('user')
->joinWith(['comments' => function($q) {
$q->joinWith(['user']);
}])
->asArray()
->all();
}