Yii Framework: Clistview сообщает о неверном количестве результатов - PullRequest
0 голосов
/ 26 июня 2011

Я использую CActiveDataProvider с CDbCriteria для поиска по некоторым связанным моделям, используя несколько связанных моделей.Код для генерации результатов выглядит следующим образом:

$criteria->select = '*, ( 3959 * acos( cos( radians(' . $latitude . ') ) 
* cos( radians( latitude ) ) * cos( radians( longitude ) - 
radians(' . $longitude . ') ) + sin( radians(' . $latitude . ') ) 
* sin( radians( latitude ) ) ) ) * 1.609344 AS distance'; 
//Basically just calculating distance from an input point
$criteria->with = array('keywords', 'coupons', 'jobs');
$criteria->order = 'distance asc';
$criteria->having = 'distance < 20';
$criteria->compare('name', $this->searchTerm, true, 'AND');

$dataProvider = new CActiveDataProvider('Store', array(
'criteria'=>$criteria));

Поиск работает нормально и получает результаты, как и ожидалось.Проблема в том, что CListview правильно сообщает количество результатов, но в любом случае показывает разбиение на страницы. Например: 'Отображение результатов 1-7 из 31 и отображение нумерации страниц.При нажатии на страницах 2, 3, 4 результаты не отображаются.

Это ошибка или я что-то не так делаю?

Ответы [ 4 ]

1 голос
/ 09 июля 2012

Попробуйте закомментировать эту строку

$criteria->with = array('keywords', 'coupons', 'jobs');

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

1 голос
/ 27 июня 2011

Иногда при сложном запросе вам нужно вручную указать количество строк в качестве количества элементов, попробуйте передать их вашему провайдеру данных с таким атрибутом, как:

'totalItemCount'=>$count,

http://www.yiiframework.com/doc/api/1.1/CDataProvider#totalItemCount-detail

0 голосов
/ 04 апреля 2013

Мне пришлось взломать CJoinElement в CActiveFinder, чтобы это исправить. Функция count в CJoinElement - это функция, которая выполняет реальную работу по отображению общего количества в сводке. Это сбрасывает группу и наличие компонентов критериев. Удаление сброса решило проблему. Смотри https://github.com/yiisoft/yii/issues/167

0 голосов
/ 29 января 2012

У меня было похожее несоответствие между счетчиком и фактическим списком записей, когда я пытался использовать запрос, включающий предложение GROUP BY.Я заметил, что в вашем запросе есть предложение HAVING.Я предполагаю, что это может вызвать аналогичные проблемы, и быстрый взгляд на источник Yii здесь показывает, что наличие предложения GROUP BY или HAVING приводит к тому, что подсчет обрабатывается иначе, чем без любого из этих предложений.

Похоже, вы использовали $criteria->having, чтобы разрешить использование вычисляемого столбца distance.Быстрая проверка, если это проблема, будет вместо этого использовать $criteria->condition и установить его равным полному вычислению следующим образом:

$criteria->condition = '( 3959 * acos( cos( radians(' . $latitude . ') ) 
* cos( radians( latitude ) ) * cos( radians( longitude ) - 
radians(' . $longitude . ') ) + sin( radians(' . $latitude . ') ) 
* sin( radians( latitude ) ) ) ) * 1.609344 < 20';

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

Кстати, чрезвычайно полезно иметь возможность проверять фактические запросы, которые делает Yii.Это может быть удивительно и показывать проблемы или неэффективность.Вы можете заставить Yii выводить информацию о запросе внизу каждой веб-страницы, установив ее в вашем защищенном / config / main.php:

'components'=>array(
   'db'=>array(
        // DB connection info as usual
    ),
    'log'=>array(
        'routes'=>array(
           array(
                'class'=>'CWebLogRoute',
                'levels'=>'trace',
            ),
        ),
     ),
),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...