Подсчет количества статей в категории с использованием CakePHP? - PullRequest
0 голосов
/ 28 августа 2009

У меня есть простое приложение cakephp с таблицей articles, в котором есть столбец cat_id для ссылки на столбец категорий id в таблице cats.

То, что я хотел бы сделать, это отобразить названия всех категорий, за которыми следует количество статей, принадлежащих к этой категории.

Я знаю, что в cakephp есть функция find('count'), но она работает только с одной таблицей / полем. Как связать две таблицы, чтобы получить список названий категорий и количество статей для каждой категории для моего просмотра?

Спасибо

Ответы [ 5 ]

4 голосов
/ 31 августа 2009

Давай! Используйте counterCache! В таблице "кошки" создайте поле article_count. В модели напишите

/app/models/cat.php
class Cat extends AppModel
{
   var $name = 'Cat';
   var $belongsTo = array('Article'=>array('counterCache'=>true));
}

Вот и все! каждый раз, когда вы добавляете / удаляете из статей, он записывает в таблицу котов количество статей. не забудьте включить article_count в список полей

2 голосов
/ 28 августа 2009

Вы также можете рассмотреть возможность counterCache для кэширования счетчика в значении столбца.

2 голосов
/ 28 августа 2009

Вы также можете использовать функцию счетчика: http://book.cakephp.org/view/816/counterCache-Cache-your-count

2 голосов
/ 28 августа 2009

может быть лучше сделать это в обратном вызове afterFind для модели, но это можно сделать и в контроллере.

$cats - $this->Cat->find('all',array('recursive'=>-1));
foreach($cats as $key=>$cat){
  $cats[$key]['ArticleCount'] = $this->Cat->Article->find('count',array(
     'conditions'=>array('Article.cat_id'=>$cat['Cat']['id']))
  );
}

или посмотрите, работает ли это

$cats = $this->Cat->find('all',array('contain'=>array(
          'Article'=>array('fields'=>array('COUNT(*) AS ArticleCount')
        )));

очевидно, вам нужно будет добавить сдерживаемое поведение в модель категории.

0 голосов
/ 28 августа 2009

Спасибо, это сработало:

        $cats = $this->Article->Cat->find('all',array('recursive'=>-1));
    foreach($cats as $key=>$cat){
      $cats[$key]['ArticleCount'] = $this->Article->find('count',array(
         'conditions'=>array('Article.cat_id'=>$cat['Cat']['id']))
      );
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...