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

And*_*res 1 mysql cakephp

我正在尝试执行一个搜索,作为条件,它必须仅返回具有一定数量关联记录的记录

目前,我有一个模型(波段)和一个相关模型thourgh hasmany(Songids)。每个乐队可以有许多歌声。

在这个特定的搜索中,我想返回4个频段的结果,其中这些频段至少具有 10个相关的Songid。

我试图在查找过程中使用“ HAVING”条件执行此操作,并使用“ COUNT(Songid.band_id)”在Songid模型中的virtualfields中执行此操作,但它仅返回总计,而不仅仅是返回所选字段。

我怎样才能做到这一点?我在想类似的东西:

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

最后一部分“'band_id COUNT'=> 2”应该可以解决问题,但我无法使其正常工作。有任何想法吗?


编辑:我可以找到所有,然后为每个关联的模型计数的foreach,但我正在寻找“一个发现,没有处理”的解决方案。

ndm*_*ndm 5

'band_id COUNT' => 2CakePHP ORM不会理解它,如果您必须使用像这样的适当SQL代码段的话COUNT(table) >= x

但是,conditions始终映射到WHERE,并且WHERE COUNT在MySQL中不起作用(使用时您可能已经知道了HAVING)。

安薇

计数器缓存

在这种特殊情况下,您可以使用计数器缓存字段

class Songid extends AppModel {
    // ...

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以使用简单的条件轻松按关联记录的数量查询:

$this->Band->find('all', array(
    // ...
    'conditions' => array(
        'Band.songid_count >=' 10
    )
));
Run Code Online (Sandbox Code Playgroud)

使用联接

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

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

$this->Band->find('all', array(
    'joins' => array(
        array(
            'table' => 'songids',
            'alias' => 'Songid',
            'type' => 'LEFT',
            'conditions' => array('Band.id = Songid.band_id')
        )
    ),
    // ...
    'group' => 'Band.id HAVING COUNT(Songid.id) >= 10'
));
Run Code Online (Sandbox Code Playgroud)