我正在尝试执行一个搜索,作为条件,它必须仅返回具有一定数量关联记录的记录。
目前,我有一个模型(波段)和一个相关模型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,但我正在寻找“一个发现,没有处理”的解决方案。
'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)