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

问题描述 投票:1回答:4

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

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

yii
4个回答
1
投票

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

'totalItemCount'=>$count,

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


1
投票

尝试评论这一行

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

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


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',
            ),
        ),
     ),
),

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.