我希望能够在右侧菜单上列出我网站上10个最受欢迎的标签(主题)作为元素。
我现在已经考虑了30分钟了,不像最后用1条语句来做这件事,我似乎要用3条语句来结束,这将大大降低网站的性能。
我有一个网站的短篇小说和标签。这是使用表"story_tags"在它们之间建立的HABTM (has -and- owned -to-many)关系。一个故事可以有多个标签,一个标签可以被多个故事使用。
目标是列出$tagname ($ storycounwiththattag),从每个标签的最高故事数到第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'),或者使用:
- 获取所有标签的ID
- 每个标签运行1个计数查询…
- 使用这些结果。
但是我选择了Cakephp来制作更好的应用程序,所以我想知道你们会怎么做!这个网站每天只有几百个访问者,所以性能不是非常重要,但是避免极其愚蠢的查询似乎是我应该尝试做的事情,即使一些性能损失并不重要。
在标签上使用counterCache(尽管您不能与HABTM一起使用,但您必须定义另一个" tag hasMany StoriesTag"关系)。还可以缓存查询结果
我在相同的场景中进行了一些测试,但使用了不同的modelname。我希望你能使用它。
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
)
)
)