У меня было похожее несоответствие между счетчиком и фактическим списком записей, когда я пытался использовать запрос, включающий предложение 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',
),
),
),
),