Yii REST API - 在查询中使用多个连接

时间:2016-08-19 05:43:14

标签: php mysql rest yii2

我有一个带有休息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');
}

...然后我得到格式正确的输出但是它只包含包含评论的帖子。

1 个答案:

答案 0 :(得分:2)

我没有检查过,但您可以尝试:

$post = Post::find()
        ->joinWith('user')
        ->joinWith(['comments' => function($q) {
             $q->joinWith(['user']);
        }])
        ->asArray()
        ->all();
}