我正在使用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正确报告了结果的数量,但无论如何都显示了分页。例如:'显示31个结果中的1-7个,并显示分页。单击第2,3,4页显示无结果。
这是一个错误,还是我做错了什么?
有时使用复杂查询,您必须手动提供行数作为项目计数,尝试使用您的dataprovider传递计数,其属性如下:
'totalItemCount'=>$count,
http://www.yiiframework.com/doc/api/1.1/CDataProvider#totalItemCount-detail
尝试评论这一行
$criteria->with = array('keywords', 'coupons', 'jobs');
并查看寻呼机和项目计数是否正确响应。我发现这是我的情况,所以我必须采取性能命中,让事情懒得加载。
当我尝试使用包含GROUP BY子句的查询时,我在计数和实际记录列表之间存在类似的不匹配。我注意到你的查询中有一个HAVING子句。我想这可能会导致类似的问题,快速查看Yii源代码here表明存在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';
condition属性用于生成WHERE子句,它不会像HAVING那样导致计数问题。
顺便说一下,能够检查Yii正在进行的实际查询是非常有用的。这可能是令人惊讶的并且显示出问题或效率低下。你可以通过在protected / config / main.php中设置它来让Yii输出每个网页底部的查询信息:
'components'=>array(
'db'=>array(
// DB connection info as usual
),
'log'=>array(
'routes'=>array(
array(
'class'=>'CWebLogRoute',
'levels'=>'trace',
),
),
),
),
我不得不在CActiveFinder中破解CJoinElement来解决这个问题。 CJoinElement中的count函数是用于显示摘要中总计数的实际工作的函数。这会重置该组并具有该标准的组成部分。删除重置修复了问题。见https://github.com/yiisoft/yii/issues/167