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

时间:2011-06-26 08:54:11

标签: yii

我正在使用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页显示无结果。

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

4 个答案:

答案 0 :(得分:1)

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

'totalItemCount'=>$count,

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

答案 1 :(得分:1)

尝试评论此行

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

并查看寻呼机和项目计数是否正确响应。我发现这是我的情况,所以我必须采取性能命中,让事情懒得加载。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我不得不在CActiveFinder中破解CJoinElement来解决这个问题。 CJoinElement中的count函数是用于显示摘要中总计数的实际工作的函数。这会重置该组并具有该标准的组成部分。删除重置修复了问题。见https://github.com/yiisoft/yii/issues/167