Yii框架:Clistview报告的结果数不正确

Yii框架:Clistview报告的结果数不正确,yii,Yii,我使用CActiveDataProvider和CDbCriteria搜索一些相关模型,使用多个相关模型。生成结果的代码如下所示: $criteria->select = '*, ( 3959 * acos( cos( radians(' . $latitude . ') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(' . $longitude . ') ) + sin( radians(' .

我使用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));
$criteria->select='*,(3959*acos(弧度('.$latitude'))
*cos(弧度(纬度))*cos(弧度(经度)-
弧度(“.$经度”)+sin(弧度(“.$纬度”))
*sin(弧度(纬度))*1.609344表示距离';
//基本上只是计算到输入点的距离
$criteria->with=array('keywords'、'coups'、'jobs');
$criteria->order='distance asc';
$criteria->have='距离<20';
$criteria->compare('name',$this->searchTerm,true',AND');
$dataProvider=新的CActiveDataProvider('Store',数组(
“标准”=>$criteria));
搜索工作正常,并按预期获得结果。问题是CListview正确地报告了结果的数量,但仍然显示分页例如:“显示31个结果中的1-7个,并显示分页。单击第2、3、4页不会显示任何结果。


这是一个错误,还是我做错了什么

有时,对于复杂查询,您必须手动提供行数作为项计数,尝试使用数据提供程序传递计数,属性如下:

'totalItemCount'=>$count,

当我尝试使用包含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';

试着注释这句话

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

并查看寻呼机和项目计数是否正确响应。我发现这是我的情况,所以我不得不承受性能损失,让懒惰的东西加载。

我不得不在CActiveFinder中破解CJoinElement来解决这个问题。CJoinElement中的count函数用于在摘要中显示总计数。这将重置组,并具有条件的组件。移除重置修复了该问题。请参见

这看起来很有希望-从查询中获取记录总数以提供给CDATA提供商的好方法是什么?好的,这里有一个黑客解决方案:。你能看一看,并提出一个更好的办法吗?
$criteria->with = array('keywords', 'coupons', 'jobs');