如何在Yii中创建条件活动记录关系

时间:2017-02-09 13:36:29

标签: yii yii2

我在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

1 个答案:

答案 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');
}

这样,您应该使用自己的用户获取所有帖子,用户和评论。