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

时间:2011-08-08 03:16:01

标签: cakephp cakephp-1.3

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

  1. 获取所有标签的所有ID
  2. 每个标签运行1次计数查询...
  3. 使用这些结果。
  4. 但我选择Cakephp来制作更好的应用程序,所以我想知道你们会怎么做!该网站每天只有几百个访问者,所以性能并不是非常重要,但是即使一些性能损失无关紧要,我也应该尝试做一些非常愚蠢的查询。

2 个答案:

答案 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
                )

        )

)