styleroom
(Styleroom)
October 28, 2013, 8:26am
1
всем привет
не совсем понял почему без использования ключа 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 записи
хэлп!
ineersa
(Ineersa)
October 28, 2013, 8:32am
2
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, то дописывайте запрос на количество сами, и иногда это и нужно.
ineersa
(Ineersa)
October 28, 2013, 9:32am
4
Дабы уточнить что меня правильно поняли
В 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(), так что стоит подумать перед тем как использовать.
styleroom
(Styleroom)
October 28, 2013, 9:33am
5
может чего посоветуете по данной ситуации: надо выбрать записи из таблицы со статьями, но только те чьи категории открыты для просмотра
у меня получилось, что надо сделать два запроса с одним условием : на количество и на выборку …
$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,
));
styleroom
(Styleroom)
October 28, 2013, 9:38am
6
претензий пока никаких нет = мне больше нравится и банально привычнее писать SQL-запросы, чем пользоваться моделями
плюс - выборка из связанных таблиц на основе моделей мне кажется громоздковатой…
вобщем = SQL-запросы нагляднее и привычнее