Как перечислить все теги (HABTM) с количеством историй менее чем за 2 запроса в Cakephp? - PullRequest
0 голосов
/ 08 августа 2011

Я хотел бы иметь возможность перечислить 10 самых популярных тегов (тем) моего сайта в правом меню в качестве элемента.

Однако я думал об этом сейчас 30 минут и, в отличие от того, чтобы закончитьс 1 заявлением, чтобы сделать это, я, кажется, в конечном итоге с 3 утверждениями, которые резко снизят производительность сайта.

У меня есть сайт с рассказами и тегами.Это отношения HABTM (Имеет-и-принадлежит-многим) между ними, использующие таблицу Stories_tags.У истории может быть несколько тегов, и тег может использоваться несколькими историями.

Цель состоит в том, чтобы перечислить $ 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. Получение всех идентификаторов всех тегов
  2. Выполнение 1 запроса-подсчета на тег ...
  3. Используйте эти результаты.

Но я выбрал Cakephp для создания лучших приложений, поэтому мне стало интересно, как вы, ребята, сделаете это!Сайт получает всего несколько сотен посетителей в день, поэтому производительность не является чрезвычайно важной, но мне следует стараться избегать чрезвычайно глупых запросов, даже если какое-то снижение производительности не имеет значения.

Ответы [ 2 ]

1 голос
/ 08 августа 2011

используйте counterCache для вашего тега (хотя вы не можете использовать его с HABTM, однако вам придется определить другое отношение "Tag hasMany StoriesTag". Вы также можете Cache результат запроса.

0 голосов
/ 08 августа 2011

Я делаю некоторые тесты в том же сценарии, но разные ModelNames. Я надеюсь, что вы можете использовать его.

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
                )

        )

)
...