Csqldataprovider

всем привет

не совсем понял почему без использования ключа totalItemCount не происходит выборка всех записей из таблицы?

и надо обязательно делать еще запрос на подсчет записей


// `article` = `id_art`, `id_gr`, `title`, `content`, `show`

$count=Yii::app()->db->createCommand('SELECT COUNT(*) FROM `article`')->queryScalar();

$sql='SELECT * FROM article';

$dataProvider=new CSqlDataProvider($sql, array(

	'totalItemCount'=>$count,

	'pagination'=>array(

		'pageSize'=>3,

	),

));  

$this->render('index_test',array(

		'dataProvider'=>$dataProvider,

));

стоит только убрать ‘totalItemCount’=>$count как пагинация исчезнет и будут доступны только 3 записи

хэлп!

Note: if you want to use the pagination feature, you must configure the totalItemCount property to be the total number of rows (without pagination).

Собственно http://www.yiiframework.com/doc/api/1.1/CSqlDataProvider написано все. А вообще для пагинации totalItemCount обязателен. В CActiveDataProvider делается запрос SELECT COUNT(*) автоматом.

Собственно если вы перешли на CSqlDataProvider, то дописывайте запрос на количество сами, и иногда это и нужно.

о как!

спасибо

Дабы уточнить что меня правильно поняли :rolleyes:

В CActiveDataProvider этот запрос делается автоматом если не указан totalItemCount.

Тоесть можно также сделать например:




$count = Yii::app()->db->createCommand('SELECT COUNT(*)...')->queryScalar();

$provider = new CActiveDataProvider('SomeModel', array(

    'totalItemCount' => $count,

    'criteria' => $criteria,

    ...



Еще этот запрос не делается если выставлено pagination=>false.

Собственно если вы начали использовать CSqlDataProvider, у вас должны быть претензии к CActiveDataProvider. Собственно первая проблема с которой я столкнулся какраз и был данный запрос. SELECT COUNT(*) отрабатывал на моей таблице порядка 6 секунд)). Так что пишите сами, например можно сделать COUNT(id), это уже улучшит производительность. Для больших таблиц с InnoDB например можно использовать EXPLAIN для вытягивания количества строк. Некоторые эмулируют журналы из MyISAM посредством триггеров и отдельной таблицы, и все это делается для очереди SELECT COUNT(), так что стоит подумать перед тем как использовать.

может чего посоветуете по данной ситуации: надо выбрать записи из таблицы со статьями, но только те чьи категории открыты для просмотра

у меня получилось, что надо сделать два запроса с одним условием: на количество и на выборку …


$condition = 'WHERE `art_group`.`show` = "yes"';           

// `article` = `id_art`, `id_gr`, `title`, `content`, `show`

// `art_group` = `id_gr`, `name`, `description`, `show`

$count=Yii::app()->db->createCommand(''

		. 'SELECT COUNT(*)'

		. 'FROM `article`'

		. 'INNER JOIN `art_group`'

		. 'USING (`id_gr`)'

		. $condition)->queryScalar();

$sql=''

		. 'SELECT `article`.*,`art_group`.`name`'

		. 'FROM `article`'

		. 'LEFT JOIN `art_group`'

		. 'USING (`id_gr`)'

		. $condition;

$dataProvider=new CSqlDataProvider($sql, array(

	'totalItemCount'=>$count,

	'pagination'=>array(

		'pageSize'=>3,

	),

));  

$this->render('index_test',array(

		'dataProvider'=>$dataProvider,

));

претензий пока никаких нет = мне больше нравится и банально привычнее писать SQL-запросы, чем пользоваться моделями

плюс - выборка из связанных таблиц на основе моделей мне кажется громоздковатой…

вобщем = SQL-запросы нагляднее и привычнее