仅检索至少具有一个关联的记录

时间:2011-04-22 13:46:48

标签: cakephp cakephp-1.3

这非常简单,但我想我以前从来没有遇到过它。我有一个Page模型hasMany Comment。我想拉出至少有一条评论的所有页面,但是删除没有评论的页面。当我看着它时,我意识到我不知道该怎么做。我想我可以使用ad hoc连接,但我宁愿使用Containable,如果可能的话。我已尝试在not null条件下测试Comment以及其他一些不太可行的事情,但看起来这应该是可行的。

我现在得到的是所有页面,其中一些页面记录中有一个空的Comment成员。如果我能这样做的话,可以跳过所有额外的残余物。

我的find电话:

    $pages = $this->Folder->Page->find(
      'all',
      array(
        'contain' => array(
          'Comment' => array(
            'order' => array( 'Comment.modified DESC' ),
          ),
          'Folder' => array(
            'fields' => array( 'Folder.id' ),
          ),
        ),
        'conditions' => array(
          'Folder.group_id' => $id,
        ),
      )
    );

感谢。

1 个答案:

答案 0 :(得分:3)

除了ad-hoc联接之外,您还有其他几种方法可供使用:

  1. 对数据集进行非规范化,并在页面表中添加has_comment标志。将'Page.has_comment' => 1添加到您的条件中。
  2. 使用DISTINCT page_id为评论运行您的查询。

    $comments = $this->Folder->Page->Comment->find('all', array(
        'conditions' => array('DISTINCT Comment.page_id'
        'contain' => array(
            'Page' => array(
                    'Folder'
            )
        )
    );
    
  3. 首先从评论表中获取一组不同的页面ID。

    $page_ids = $this->Folder->Page->Comment->find('list', array(
        'fields' => array('id', 'page_id'),
        'conditions' => array('DISTINCT Comment.page_id'),
    );
    $pages = $this->Folder->Page->find('all', array(
        'conditions' => array('Page.id' => $page_ids),
        'contain' => array(
            ...
        )
    );