CakePHP - 查找并计算存在多少关联记录

时间:2014-05-22 19:49:25

标签: mysql cakephp

我试图执行搜索,作为条件,它必须只返回一定数量的相关记录的记录。

目前我有一个模型(Bands)和一个相关模型thourgh hasmany(Songids)。每个乐队都有很多歌曲。

在这个特定的搜索中,我想返回4个乐队的结果,其中这些乐队的至少 10个相关的歌曲。

我尝试用" HAVING"使用" COUNT(Songid.band_id)"在" COUNT(Songid.band_id)"中的查找过程中的条件和在其中的虚拟字段。但它只返回总数,而不仅仅是选定的字段。

我怎样才能做到这一点?我想的是:

    $random = $this->Band->find('all', array(
            'fields' => array('Band.band'),
            'order' => 'rand()',
            'limit' => 4,
            'contain' => array(
                'Songid' => array(
                    'conditions' => array(
                        'band_id COUNT' => 2)
                )
            )
        )
    );

最后一部分"' band_id COUNT' => 2"应该做的但我不能让它发挥作用。 有什么想法吗?


编辑:我可以找到所有,然后是一个带有每个相关模型的计数的foreach,但我正在寻找一个"一个发现,没有处理"溶液

1 个答案:

答案 0 :(得分:4)

'band_id COUNT' => 2不是CakePHP ORM可以理解的,如果你必须使用正确的SQL代码段COUNT(table) >= x

但是conditions始终映射到WHEREWHERE COUNT无法在MySQL中工作(您可能已经注意到了这一点,因为您已经提到过{{1} }})。

... Anways

计数器缓存

在这种特殊情况下,您可以使用counter cache字段

HAVING

通过这种方式,您可以使用以下简单条件轻松查询相关记录的数量:

class Songid extends AppModel {
    // ...

    public $belongsTo = array(
        'Band' => array(
            'counterCache' => true,
        )
    );

    // ...
}

使用连接

当不使用计数器时,您必须手动加入关联表,因为它们不会自动包含在内,而是用于单独的查询中。

加入后,您可以安全地查询相关模型:

$this->Band->find('all', array(
    // ...
    'conditions' => array(
        'Band.songid_count >=' 10
    )
));