我试图执行搜索,作为条件,它必须只返回一定数量的相关记录的记录。
目前我有一个模型(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,但我正在寻找一个"一个发现,没有处理"溶液
答案 0 :(得分:4)
'band_id COUNT' => 2
不是CakePHP ORM可以理解的,如果你必须使用正确的SQL代码段COUNT(table) >= x
。
但是conditions
始终映射到WHERE
,WHERE 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
)
));