我希望能够在右侧菜单中列出我网站上最受欢迎的10个标签(主题)作为元素。
然而,我现在已经考虑了30分钟,不像最后用1条声明来做这件事,我似乎最终得到3条声明会大大降低网站的性能。我有一个包含短篇故事和标签的网站。这是使用表'stories_tags'的HABTM(拥有并且属于多对)关系。故事可以有多个标签,多个故事可以使用标签。
目标是将每个标签的最高故事数量$ tagname($ storycountwiththattag)列为第10高。到目前为止,我有这个,但它似乎并不太近。
$tags = $this->Tag->find('all',array('fields'=>array('Tag.name')));
$tags_count = $this->Tag->Story->find('count',array('conditions'=>array('Story.tag'=>$tags)));
debug($tags_count);
我尝试了很多可能的查询。我可以使用受限制的查找('all'),或者使用:
但我选择Cakephp来制作更好的应用程序,所以我想知道你们会怎么做!该网站每天只有几百个访问者,所以性能并不是非常重要,但是即使一些性能损失无关紧要,我也应该尝试做一些非常愚蠢的查询。
答案 0 :(得分:1)
在您的代码上使用counterCache(虽然您不能使用HABTM,但您必须定义另一个“Tag hasMany StoriesTag”关系。您还可以Cache查询结果。
答案 1 :(得分:0)
我在相同的场景中进行了一些测试,但是不同的模型名称。我希望你能用它。
function top(){
$options = array(
'fields' => array('*','COUNT(CategoriesEnterprise.enterprise_id) AS num')
, 'group' => array( 'CategoriesEnterprise.category_id' )
, 'order' => 'num DESC'
, 'limit' => '3'
, 'joins' => array(array(
'table' => 'categories',
'alias' => 'Category',
'type' => 'LEFT',
'conditions' => array('CategoriesEnterprise.category_id = Category.id')
))
);
$categories = $this->Category->CategoriesEnterprise->find('all', $options);
debug($categories);
$this->autoRender = false;
}
结果
Array
(
[0] => Array
(
[CategoriesEnterprise] => Array
(
[category_id] => 3
[enterprise_id] => 7
)
[Category] => Array
(
[id] => 3
[name] => Turismo y Viajes
[modified] => 2011-05-16
[created] => 2011-04-14
)
[0] => Array
(
[num] => 4
)
)
[1] => Array
(
[CategoriesEnterprise] => Array
(
[category_id] => 24
[enterprise_id] => 5
)
[Category] => Array
(
[id] => 24
[name] => Compras
[modified] => 2011-05-05
[created] => 2011-05-05
)
[0] => Array
(
[num] => 3
)
)
[2] => Array
(
[CategoriesEnterprise] => Array
(
[category_id] => 32
[enterprise_id] => 8
)
[Category] => Array
(
[id] => 32
[name] => Salud y Belleza
[modified] => 2011-05-16
[created] => 2011-05-16
)
[0] => Array
(
[num] => 3
)
)
)