如何在Cakephp中列出所有标签(HABTM)与少于2个查询的故事数量



我希望能够在右侧菜单上列出我网站上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'),或者使用:

  1. 获取所有标签的ID
  2. 每个标签运行1个计数查询…
  3. 使用这些结果。

但是我选择了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
                )
        )
)

最新更新