yii CActiveDataProvider具有限制和分页

时间:2010-12-30 09:58:43

标签: mysql activerecord yii

我正在尝试从表中选择几行并在多个页面中进行渲染(分页)。 这是模型中的代码:

   return new CActiveDataProvider('Downloads',
        array(
            'criteria' => array(
                'select' => 'download_id,title,thumb_ext',
                'order' => 'download_id DESC',
                'limit' => $count,
            ),
            'pagination' => array('pageSize' => 5,),
        )
    );

在视图中,我使用CGridView显示它:

    $this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider'=>$dataProvider,
        'columns' => array('download_id', 'title', 'thumb_ext'),
    ));

问题是CActiveDataProvider忽略了条件限制并返回表的所有行...

感谢。

3 个答案:

答案 0 :(得分:7)

我不是肯定的...但我认为Yii使用LIMIT子句来执行SQL结果分页,因此它将覆盖/替换您的LIMIT子句。您可以通过打开CWebLogRoute日志路由来检查这一点,以确切了解正在执行的SQL。

无论如何,我不太确定这是怎么回事。你添加的LIMIT条款是什么?如果你正在进行分页,为什么不让用户对所有记录进行分页? 解决方案可能是改变您的标准以摆脱LIMIT条款。

您是否尝试设置每页的结果数量?您已将pageSize设置为5但是......

另一件可能会做你想做的事情就是查看基本的Pager类,CPagination。使用CLinkPager,它可以让您比使用CGridView的CListPager更具创造性地进行分页。

祝你好运!

答案 1 :(得分:5)

我遇到了同样的问题,我找到了一个解决方案如下:

return new CActiveDataProvider('Downloads',
    array(
        'criteria' => array(
            'select' => 'download_id,title,thumb_ext',
            'order' => 'download_id DESC',
        ),
        'pagination' => array('pageSize' => 5,),
        'totalItemCount' => $count,
    )
);

并将CGridView设置为分页隐藏:

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'enablePagination' => false,
    'columns' => array('download_id', 'title', 'thumb_ext'),
));

答案 2 :(得分:2)

数据提供程序的一个基本功能是,您可以通过在配置中指定“totalItemCount”来覆盖行数的计算。通常(我还没有测试过)这也适用于ActiveDataProvider:

return new CActiveDataProvider('Downloads',
        array(
            'criteria' => array(
                'select' => 'download_id,title,thumb_ext',
                'order' => 'download_id DESC',
            ),
            'pagination' => array('pageSize' => 5,),
            'totalItemCount' => $count,
        )
    );