5

所以我看到 zend paginate 工作的方式是你这样做:

$paginator = Zend_Paginator::factory($results);
$paginator->setItemCountPerPage($itemCount);
$paginator->setPageRange($pageRange);

其中 $results 是以下列形式从数据库中加载一堆项目的结果

"SELECT * FROM table WHERE etc"

然后zend paginate会统计结果的数量并自动生成页面范围...

但是如果你这样做,那么你将不得不获取数据库的所有结果,我认为这是一种浪费,因为一次只显示一个页面,因此你只需要获取该页面的项目......

您如何使 zend 分页能够计算正确的页面范围和数字,而无需获取整个表格的所有结果?

4

5 回答 5

4

使用工厂方法,您可以发送 Zend_Db_Select 或 Zend_Db_Table_Select 的实例。如果您是类扩展 Zend_Db_Table_Abstract,您可以简单地从中构建一个选择查询,然后发送它。如果没有,您可以创建一个实例并发送它,请参阅文档中的示例:

    $adapter = new Zend_Paginator_Adapter_DbSelect($db->select()->from('posts'));
    $adapter->setRowCount(
        $db->select()
           ->from(
                'item_counts',
                array(
                   Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN => 'post_count'
                )
             )
    );

$paginator = new Zend_Paginator($adapter)

http://framework.zend.com/manual/en/zend.paginator.usage.html#zend.paginator.usage.dbselect

于 2010-11-11T17:46:13.473 回答
0

你不能这样做,Zend_Paginator你必须自己这样做,但这很简单,将查询更改为这种形式:SELECT * FROM table WHERE etc LIMIT 0, 30然后例如在这种情况下你将获得前 30 行,如果你将获得下一个然后使用SELECT * FROM table WHERE etc LIMIT 30, 60

以其他方式记住,您将获得框架的功能始终不是最佳的,并且使用最简单的实现复杂性,因为对于最快的解决方案,您必须使用一些更紧密的使用代码(我的意思是在许多情况下您不能使用此代码,而不像最复杂的代码),解决方案更专注于问题,像这样,你致力于mysqlPaginator不要在数据库层上工作,然后他只根据输入工作,其中输入是所有行,这个代码不能更快地做到这一点。

于 2010-11-11T17:41:01.133 回答
0

您必须以不同的方式使用 zend 分页器。请查看该函数的文档。转到“DbSelect 和 DbTableSelect 适配器”部分,它提供了有关如何选择记录计数而不是获取所有记录的示例。

于 2010-11-11T17:44:31.253 回答
0

这取决于您使用的适配器。如果使用Zend_Paginator_Adapter_Array,zend 分页器将通过数组长度计算页面范围等。但是如果你使用Zend_Paginator_Adapter_DbSelect,zend 分页器会根据你的查询自动创建查询select count(*) ...... as zend_paginator_row_count来计算行数,它不会加载你所有的数据库结果。

于 2010-11-12T04:56:07.673 回答
0

Zend_Db_Select 和 Zend_Db_Table_Select 是解决问题的好方法,我在六个月前也不得不处理这个问题。

假设我的数据库中有一个 Books 表,并且我定义了一个搜索函数来允许我在整个表的字段中进行全文搜索:

Default_Model_DbTable_Books.php:

public class Default_Model_DbTable_Books extends Zend_Db_Table_Abstract {

    // Other variables and methods here...

    public function search($query) {
        // Initialize Zend_Db_Table_Select object
        $select = $this->select(true);

        if (isset($query) && is_string($query)) {
            // Logic for search (don't actually do this, it's horrible for performance)
            $db = $this->getAdapter();
            $where = $db->quoteInto('isbn LIKE ? OR name LIKE ? OR author LIKE ?', $query);
            $search->where($where)
                   ->order('date_published DESC')
                   ->group('author');
        }

        return $select;
    }
}

Default_Model_Mapper_Book.php:

public class Default_Model_Mapper_Book {

    // Defined functions as per Zend Quickstart Mapper classes...

    public function search($query) {
        // Returns Zend_Db_Table_Select object
        return $this->getDbTable()->search($query);
    }
}

Default_BooksController.php:

public function listAction() {
    $mapper = new Default_Model_Mapper_Book();
    $select = $mapper->search($this->_getParam("query"));
    $paginator = Zend_Paginator::factory($select);
}
于 2010-11-19T21:01:14.473 回答