Yii2 GridView分页只有next和prev链接,没有TotalCount

时间:2015-05-25 16:53:34

标签: php gridview pagination yii2

有一个包含数百万行的巨大数据库表,它需要在GridView中输出,并且在分页器中只有prev和next链接。

我不想在这些表上使用'select count(*)',所以没有TotalCount。另外,我想阻止用户设置大量偏移并降低MySQL性能。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

创建数据提供者时,请确保将totalCount指定为一个数字,例如0,这将阻止Yii运行count(*)查询。

然后,您应该为yii \ widgets \ Linkpager创建一个替换类,它只生成您想要显示的链接。

最后,将寻呼机连接到GridView。

<?php GridView::widget([
'dataProvider'=>$dataProvider,
'pager' => [
   'class' => 'path\to\my\custom\Pager\'
 ]
 'columns' => 
         ....
]; ?>

答案 1 :(得分:0)

我已经等了几天才能确保我没有错过一些明显的解决方案,但现在需要自己进行硬编码。我发现最快的方法是扩展DataProvider并重写方法:prepareTotalCount()prepareModels()

namespace common;
use yii\data\ActiveDataProvider;
use yii\base\InvalidConfigException;
use yii\db\QueryInterface;

class BigActiveDataProvider extends ActiveDataProvider
{
    protected function prepareTotalCount() {
        return 0;
    }

    protected function prepareModels()
    {
        if (!$this->query instanceof QueryInterface) {
            throw new InvalidConfigException('The "query" property must be an instance of a class that implements the QueryInterface e.g. yii\db\Query or its subclasses.');
        }
        $query = clone $this->query;

        if (($pagination = $this->getPagination()) !== false) {
            $pagination->validatePage = false;
            $page = $pagination->getPage(true) + 1;
            $offset = $page*$pagination->getPageSize();

            $query->limit($pagination->getLimit() + 1)->offset($offset);
        }
        if (($sort = $this->getSort()) !== false) {
            $query->addOrderBy($sort->getOrders());
        }

        $res = $query->all($this->db);

        if (($pagination = $this->getPagination()) !== false) {
            $pagination->totalCount = ($page)*$pagination->getPageSize();
            if (count($res) > $pagination->getPageSize()) {
                unset($res[count($res)-1]);
                $pagination->totalCount++;
            }
        }

        return $res;
    }
}

我不认为这是最好的解决方案,但它按计划运行,并不限制ActiveDataProvider功能。它只确保不执行count(*)查询,并且不需要设置totalCount