Создаём классические таблицы Юзера и Новости:
Код: Выделить всё
CREATE TABLE IF NOT EXISTS `test_new` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
FOREIGN KEY (user_id)
REFERENCES test_user(id)
) ENGINE=MyISAM;
INSERT INTO `test_new` (`id`, `user_id`, `title`) VALUES
(1, 3, 'new1'),
(2, 1, 'new2'),
(3, 1, 'new3'),
(4, 2, 'new4'),
(5, 3, 'new5'),
(6, 4, 'new6');
CREATE TABLE IF NOT EXISTS `test_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
INSERT INTO `test_user` (`id`, `name`) VALUES
(1, 'user1'),
(2, 'user2'),
(3, 'user3'),
(4, 'user4');
Код: Выделить всё
class TestNew extends CActiveRecord
{
public function relations()
{
return array(
'user' => array(self::BELONGS_TO, 'TestUser', 'user_id'),
);
}
}
Код: Выделить всё
<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
)); ?>
<p>TotalItemCount = <?php echo $dataProvider->totalItemCount; ?></p>
<p>ItemCount = <?php echo $dataProvider->itemCount; ?></p>
Код: Выделить всё
<fieldset>
<h2><?php echo $data->title; ?></h2>
<p>Автор: <?php echo $data->user->name; ?></p>
</fieldset>
Код: Выделить всё
class TestController extends Controller
{
public function actionIndex()
{
$criteria = new CDbCriteria();
$criteria->with = array('user');
$criteria->group = 'user_id';
$dataProvider = new CActiveDataProvider('TestNew', array(
'criteria'=>$criteria,
));
$this->render('index', array(
'dataProvider'=>$dataProvider,
));
}
}
Причём если убрать жадную загрузку, то есть строку
Код: Выделить всё
$criteria->with = array('user');
то выводит правильно 4 из 4. Получается, что totalItemCount при жадной загрузке не учитывает группировку.
В журнале запросов увидел различия. Вот запросы без жадной загрузки:
Код: Выделить всё
SELECT COUNT(*) FROM (SELECT * FROM `test_new` `t` GROUP BY user_id);
SELECT * FROM `test_new` `t` GROUP BY user_id LIMIT 10;
Код: Выделить всё
SELECT COUNT(DISTINCT `t`.`id`) FROM `test_new` `t` LEFT OUTER JOIN `test_user` `user` ON (`t`.`user_id`=`user`.`id`);
SELECT * FROM `test_new` `t` LEFT OUTER JOIN `test_user` `user` ON (`t`.`user_id`=`user`.`id`) GROUP BY user_id LIMIT 10;
Добавив пагинацию
Код: Выделить всё
$dataProvider = new CActiveDataProvider('TestNew', array(
'criteria'=>$criteria,
'pagination'=>array(
'pageSize'=>5
)
));
Элементов найдено 4, а все думают, что их 6 и на вторую страницу ещё хватит.
Как выход, можно не использовать жадную загрузку, но при группировке по полю связанной таблицы
Код: Выделить всё
$criteria->with = array('user');
$criteria->group = 'user.name';