加入CakePHP - 更好的理解

时间:2014-11-19 20:04:44

标签: cakephp join pagination

我想通过解决以下示例来更好地理解CakePHP(v 2.4.5)中的joins

Post hasMany Comment
Post.id == Comment.post_id
Comment.published可以是10

  • 我需要查找至少有一条已发布评论的所有帖子
  • 我想从Post模型中编写查询。为了不打破分页,我可以根据Post
  • 添加订单/条件
  • 我不想在PHP中过滤掉结果(为了不破坏分页)

您可能建议从Comment模型处理此问题,如下所示:
https://stackoverflow.com/a/3890461/155638
但这是关于更好地理解联接,所以我想设置从Post模型编写查询的要求。

我大致有以下想法,希望RIGHT联接会排除所有不符合要求的帖子:

$this->Post->find('all', array(
    'joins' => array(
        array(
            'table' => 'comments',
            'alias' => 'CommentsJoined',
            'type' => 'RIGHT',
            'conditions' => array(
                'Post.id = CommentsJoined.post_id',
                'CommentsJoined.published = true'
            )
        )
    ),
    'contain' => array(
        'Comment' => array(
             'conditions' => array(
                 'Comment.published' => 1
             )
        )
    )
);

但它对我来说还不适用 目前,我的查询返回19次相同的帖子,而不是19个唯一的帖子。

如何离开这里?这种方法是正确的吗?

亲切的问候!
巴特

1 个答案:

答案 0 :(得分:1)

我似乎走在了正确的轨道上。最后一步是删除重复的帖子 这是通过将'group' => 'Post.id'添加为查询的属性来完成的。

像这样:

$this->Post->find('all', array(
    'joins' => array(
        array(
            'table' => 'comments',
            'alias' => 'CommentsJoined',
            'type' => 'RIGHT',
            'conditions' => array(
                'Post.id = CommentsJoined.post_id',
                'CommentsJoined.published = true'
            )
        )
    ),
    'group' => 'Post.id',
    'contain' => array(
        'Comment' => array(
             'conditions' => array(
                 'Comment.published' => 1
             )
        )
    )
);