【问题标题】:Yii pagination showing fewer items than availableYii 分页显示的项目比可用的少
【发布时间】:2017-02-10 23:34:01
【问题描述】:

我有一个从 CActiveDataProvider 提供的简单 CGridView。目前,我不确定这已经发生了多长时间,它不会在启用分页的视图中显示所有数据项。

我的标题显示“显示 9 个结果中的 1-7 个”,但没有更多页面的按钮。如果我将数据提供者的 pagenation 属性的 pageSize 设置为一个较小的数字,我最终会得到分页按钮,但它似乎在第一页上显示的项目比第二页少。例如,如果我将 CActiveDataProvider 的 pageSize 设置为 3,我会得到 2,2,3(每页上的项目),而不是我预期的 3,3,1。

如果我将 pageSize 设置为 9 到 11 之间的任何值(包括 9 到 11),则有些项目我看不到,因为我只看到一页并且并非所有项目都显示(如果我将 pageSize 设置为 9,则为“1-6 of 9” )。

$criteria=new CDbCriteria;
$criteria->with = array('registrations'); 
$criteria->addCondition('registrations.id IS NOT NULL');
$criteria->addCondition('registered = false');
$criteria->together = true;
$dataProvider = new CActiveDataProvider('Skier', array('criteria'=>$criteria));

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array('name'=>'fullname', 'header'=>'Name'),
        array(
            'name'=>'programs_names',
            'header'=>'Programs',
            'value'=>'$data->programs_names',
        ),
        <More items here>
    )
));

有人知道什么会导致分页如此不稳定吗?

编辑:另外,将 CActiveDataProvider 更改为 CArrayDataProvider 工作正常,我得到 9 个结果中的 9 个。这暂时可行,因为我的数据集很小,但我宁愿弄清楚问题可能出在哪里。

$dataProvider = new CArrayDataProvider(Skier::model()->findAll($criteria));

【问题讨论】:

  • 这个问题解决了吗?我有同样的问题。我怀疑这与执行两个不同计数的底层查询机制有关,并且由于某些极端情况或数据的特殊性,这些计数最终不匹配。
  • 嗨,你找到 CActiveDataProvider 的任何解决方案了吗?我遇到了类似的问题,我不知道这里出了什么问题。

标签: php yii pagination cgridview cactivedataprovider


【解决方案1】:

如果您使用的是复杂查询,请试试这个

$count=Yii::app()->db->createCommand('SELECT COUNT(*) FROM tbl_user')->queryScalar();

$sql='SELECT * FROM tbl_user';

$dataProvider=new CSqlDataProvider($sql, array(
    'totalItemCount'=>$count,
    'sort'=>array(
        'attributes'=>array(
             'id', 'username', 'email',
        ),
    ),
    'pagination'=>array(
        'pageSize'=>10,
    ),
));
// $dataProvider->getData() will return a list of arrays.

然后你可以将你的 $dataProvider 传递给你的 CGridView

有关使用自定义查询作为 dataProvider 的更多文档,请查看 here.

【讨论】:

  • 我可以尝试类似的方法,但看起来,如果它有效,它只是使用更复杂的 SQL 查询而不是使用模型来解决 CActiveDataProvider 的其他一些错误。我从未见过这个之前,并且有很多与数据提供者的网格视图,所以我认为这是我的查询或模型的问题,但我希望有人能阐明可能导致这种奇怪行为的原因。
【解决方案2】:

我遇到了这样的问题。这是由于数据库中有重复的条目(主键)。

【讨论】:

  • 我也有同样的问题,但在我的项目中并非如此。我的搜索中有 2 个连接,每个模型都有一个唯一的和一个主键,但它仍然不起作用。我怀疑这可能是框架和错误。
【解决方案3】:

我必须将$criteria-&gt;with 及其together=true 放入if()

if( (int) $this->categoria_id > 0) {
    $criteria->with = Array (
        'categorie'=> Array (
            'together' => true,
        )
    );
    $criteria->compare ('categorie.id', $this->categoria_id);
}

否则CActiveDataProvider 分页together=true 并且没有传递参数返回错误计数

【讨论】:

    【解决方案4】:

    要准确显示 ALL 记录,例如'count rows',然后'supply $countResult to pageSize',例如

    首先计算行,例如(这是一个示例,'User' = 'your model name'))

    $countResult = User::model()->countByAttributes(array('record_name' => $matched_record_name));
    

    $countResult = User::model()->count($condition);
    

    然后将 $countResult 提供给 pageSize

                'pagination'=>array(
                    'pageSize' => intval($countResult),
                    )), 
    

    【讨论】:

      【解决方案5】:

      尝试将以下内容添加到“滑雪者”模型的搜索方法中:

      $criteria->group = "id";
      

      或者:

      $criteria->group = "t.id";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 2020-08-19
        • 1970-01-01
        • 2012-06-21
        相关资源
        最近更新 更多