【问题标题】:Yii Framework: Clistview reporting incorrect number of resultsYii 框架:Clistview 报告不正确的结果数量
【发布时间】:2019-02-21 23:53:37
【问题描述】:

我正在使用 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


    【解决方案1】:

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

    'totalItemCount'=>$count,
    

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

    【讨论】:

    • 这看起来很有希望 - 从查询中获取记录总数以馈入 CDataProvider 的好方法是什么?
    • 好的,这里有一个 hacky 解决方案:pastebin.com/ZUAHBm3P。你能看看,并提出更好的方法吗?
    【解决方案2】:

    尝试注释掉这一行

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

    并查看寻呼机和项目计数是否正确响应。我发现这是我的情况,所以我必须降低性能并让事物延迟加载。

    【讨论】:

      【解决方案3】:

      当我尝试使用包含 GROUP BY 子句的查询时,计数与实际记录列表之间存在类似的不匹配。我注意到您的查询中有一个 HAVING 子句。我想这可能会导致类似的问题,快速查看 Yii 源代码here 会发现 GROUP BY 或 HAVING 子句的存在导致计数的处理方式与没有这些子句的情况不同。

      您似乎使用了$criteria-&gt;having 来允许使用计算列distance。如果这是问题的一个快速测试是使用 $criteria-&gt;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',
                  ),
              ),
           ),
      ),
      

      【讨论】:

        【解决方案4】:

        我不得不破解 CActiveFinder 中的 CJoinElement 来解决这个问题。 CJoinElement 中的 count 函数是真正用于在摘要中显示总计数的函数。这将重置组并具有标准的组件。删除重置解决了问题。见https://github.com/yiisoft/yii/issues/167

        【讨论】:

          猜你喜欢
          • 2012-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多