Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Подсчет статей в категориях
http://forum.kohanaframework.su/viewtopic.php?f=33&t=97
Страница 1 из 2

Автор:  Malik [ 27 мар 2012, 15:09 ]
Заголовок сообщения:  Подсчет статей в категориях

Доброго времени суток =)

Имеется контроллер:
Код:
$categories = Model::factory('category')->categories();

$content = View::factory('index/v_main', array(
  'categories' => $categories,
)
);


Модель Category:
Код:
public function categories()
{
  $query = DB::select()->from('category')->order_by('name', 'DESC');
  return $query->execute();
}


Таблица category:
Код:
CREATE TABLE IF NOT EXISTS `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


Вид v_main:
Код:
<? foreach ($categories as $category): ?>
<div class="main">
<?=HTML::anchor('category/'.$category['id'], $category['name'])?> [0]
</div>
<? endforeach ?>


Таблица article:
Код:
CREATE TABLE IF NOT EXISTS `article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_cat` int(11) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


Подскажите как сделать подсчет статей в категориях?

Автор:  admin [ 28 мар 2012, 02:29 ]
Заголовок сообщения:  Re: Подсчет статей в категориях

Я лично в подобных случаях добавлял в таблицу категорий поле "Количество статей".Соответственно при добавлении статьи идет инкремент в это поле, а при удалении -декремент. Но это мне надо было на одной странице знать количество статей во всех категориях. Если такое не требуется, то можно стандартно, через count.

Автор:  Malik [ 28 мар 2012, 02:43 ]
Заголовок сообщения:  Re: Подсчет статей в категориях

admin писал(а):
Я лично в подобных случаях добавлял в таблицу категорий поле "Количество статей".Соответственно при добавлении статьи идет инкремент в это поле, а при удалении -декремент. Но это мне надо было на одной странице знать количество статей во всех категориях. Если такое не требуется, то можно стандартно, через count.


Можете показать пример как это реализовать через count?
А то как ни пытался - не получается.

Автор:  admin [ 28 мар 2012, 16:22 ]
Заголовок сообщения:  Re: Подсчет статей в категориях

Ну вот для комментариев, например, я пишу так:

Код:
   //Получение количества комментариев
   public function countComments($article_id)
   {
        $count = DB::select(DB::expr('COUNT(`id`) AS mycount'))
            ->from('comments')
            ->where('article_id', '=', $article_id);               
            
      $count = $count->execute()->get('mycount');            
      return $count;
   }


если необходимо исключить повторяющиеся значения при подсчете, можно использовать DISTINCT, хотя тут ненадо, но мало ли понадобится ) Что-то вроде
Код:
      $count = DB::select(DB::expr('COUNT(DISTINCT `id`) AS mycount'))
            ->from('articles')
                         .....

Обычно требуется, когда вы объединяете таблицы, используя JOIN.

Автор:  Malik [ 28 мар 2012, 16:40 ]
Заголовок сообщения:  Re: Подсчет статей в категориях

Модель у меня подобным образом и реализована, но вот не могу понять как передать $id_article в контроллере :(

Автор:  admin [ 28 мар 2012, 17:07 ]
Заголовок сообщения:  Re: Подсчет статей в категориях

Хм. А в чем проблема-то ? Ну допустим
Код:
$comment = new Model_Comment();
$count = $comment->countComments($article_id);


А сам $article_id - это ид статьи, его мы получаем обычно из адреса.
Код:
$article_id = $this->request->param('id');


Это пример для подсчета комментариев к статье с определенным ид. У вас надо определить ид категории, чтобы потом подсчитать статьи, которые к ней относятся (связь один ко многим). Я не знаю, как у вас все реализовано, но в адресной строке вы же наверняка что-то передаете.

Автор:  Malik [ 28 мар 2012, 21:29 ]
Заголовок сообщения:  Re: Подсчет статей в категориях

admin писал(а):
Хм. А в чем проблема-то ? Ну допустим
Код:
$comment = new Model_Comment();
$count = $comment->countComments($article_id);


А сам $article_id - это ид статьи, его мы получаем обычно из адреса.
Код:
$article_id = $this->request->param('id');


Это пример для подсчета комментариев к статье с определенным ид. У вас надо определить ид категории, чтобы потом подсчитать статьи, которые к ней относятся (связь один ко многим). Я не знаю, как у вас все реализовано, но в адресной строке вы же наверняка что-то передаете.


Вы не поняли.
Я про то, когда выводим все категории.

В этом контроллере:
Код:
$categories = Model::factory('category')->categories();

$content = View::factory('index/v_main', array(
  'categories' => $categories,
)
);

Автор:  admin [ 29 мар 2012, 02:02 ]
Заголовок сообщения:  Re: Подсчет статей в категориях

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

Автор:  Malik [ 29 мар 2012, 02:28 ]
Заголовок сообщения:  Re: Подсчет статей в категориях

admin писал(а):
Выводятся все категории и нужно посчитать, сколько в каждой статей ? Тогда проще, как я говорил, сделать поле в категориях - Количество статей. Потому что для каждой вызывать запрос нерентабельно.


Ну а все же как реализовать с вызыванием запросов на подсчет? :geek:

P.S. Для личного развития :)
Например: для подсчета новых статей, в таблице со статьями имеется поле времени добавления.

Автор:  admin [ 29 мар 2012, 02:34 ]
Заголовок сообщения:  Re: Подсчет статей в категориях

ну видимо для каждой категории вызывать
Цитата:
$count = DB::select(DB::expr('COUNT(`id`) AS mycount'))
->from('comments')
->where('article_id', '=', $article_id);


передавая каждый раз новое $article_id

Страница 1 из 2 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/