我有一个场景,我有模板,有很多主题。 足够清楚,我的关系将是模板hasmany主题 我想显示主题数量的模板,我正在应用此代码:
$this->Template->recursive = 2;
$this->Template->bindModel(
array(
'hasMany' =>array(
'TemplateTheme'=>array(
'className'=>'TemplateTheme',
'fields' => 'count(TemplateTheme.id) AS themes'
)
)
),false
);
$this->paginate = array(
'order' => array('Template.modified DESC'),
'limit' =>$limit
);
$template = $this->paginate('Template');
pr($template);die();
但我得到的是
Array
(
[0] => Array
(
[Template] => Array
(
[id] => 1
[name] => churchDesign
[status] => Active
[created] => 2011-10-24 10:37:23
[modified] => 2011-10-25 15:16:46
)
[TemplateTheme] => Array
(
[0] => Array
(
[template_id] => 1
[TemplateTheme] => Array
(
[0] => Array
(
[themes] => 3
)
)
)
)
)
[1] => Array
(
[Template] => Array
(
[id] => 2
[name] => blossoms
[status] => Active
[created] => 2011-10-19 00:00:00
[modified] => 2011-10-24 14:05:27
)
[TemplateTheme] => Array
(
)
)
)
这里的问题是它计算第一个数组中的所有主题(第一个模板)。查看[TemplateTheme] =>排列 ( [0] =>排列 ( [themes] => 3 ) 第三个主题实际上属于第二个模板。关系是
template_id位于主题表中,用于表示模板的每个主题。
模板1有2个主题,模板2有一个主题,目前它在第一个模板中显示所有三个主题。
我想要这样的方式
templatename1
count of themes 1st template
template name 2
count of themes of 2nd template
请告诉我正确的方法。
答案 0 :(得分:1)
如果您想获得每个模板的主题数,最优雅的方法是使用counterCache。
另一种方法是使用Containable行为,它只获取你想要的相关数据,然后用PHP计算获取的数据数组。 将可包含的行为附加到模型模型后,这样的一些代码应该起作用:
$allTemplates = $this->Templates->find('all', array(
'contain' => 'TemplateTheme.name'
));
foreach($allTemplates as $template){
$currentThemeCount = count($template['TemplateTheme']);
foreach($template['TemplateTheme'] as $theme){
echo $theme['name'];
}
}
希望这可以帮助一路上的人。
答案 1 :(得分:0)
您可以将主题数组计算为
foreach($template as $t){
count($t['TemplateTheme'])
}
希望这会有所帮助
答案 2 :(得分:0)
您应该使用find('count')方法,而不是像现在这样使用虚拟'count'字段。例如:
$allTemplates = $this->Template->find('all');
foreach($allTemplates as $data) {
$templateCount = $this->Template->TemplateTheme->find('count', array(
'conditions' => array(
'TemplateTheme.template_id' => $data['Template']['id']
)
));
// $templateCount should now contain the count of this specific template. Foreach will continue recursion for all others.
}