所以我看到zend paginate工作的方式就是:
$paginator = Zend_Paginator::factory($results);
$paginator->setItemCountPerPage($itemCount);
$paginator->setPageRange($pageRange);
其中$ results是以
的形式从数据库加载一堆项目的结果"SELECT * FROM table WHERE etc"
然后zend paginate将计算结果数并自动生成页面范围......
但是如果你这样做,那么你将不得不获取数据库的所有结果,我认为这是一种浪费,因为一次只显示一个页面,因此你只需要获取该页面的项目。 ..
如何使zend paginate能够计算正确的页面范围和数字而无需获取整个表的所有结果?
答案 0 :(得分:4)
使用工厂方法,您可以发送Zend_Db_Select或Zend_Db_Table_Select的实例。如果你是类扩展Zend_Db_Table_Abstract,你可以简单地从它构建一个select查询,然后发送它。如果没有,您可以创建实例并发送它,请参阅文档中的示例:
$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
答案 1 :(得分:0)
您无法使用Zend_Paginator
执行此操作,您必须自己执行此操作,但这非常简单,请将查询更改为此表单:SELECT * FROM table WHERE etc LIMIT 0, 30
然后例如在这种情况下您将获得前30行,如果你接下来会使用SELECT * FROM table WHERE etc LIMIT 30, 60
另外请记住,你将获得框架的功能总是不是最优的,并且最简单地实现复杂性,因为对于最快的解决方案,你必须使用一些更严格的使用代码(我的意思是你在很多情况下不能使用这个代码)不像最复杂的代码那样),解决方案更专注于这个问题,像这样,你专注于mysql
,Paginator
不能在数据库层上工作,那么他只能根据输入的输入工作所有行,这段代码都不能更快地完成。
答案 2 :(得分:0)
您必须以不同方式使用zend paginator。请查看该功能的documentation。下到“DbSelect和DbTableSelect适配器”部分,它提供了一个如何选择记录计数的示例,而不是获取所有记录。
答案 3 :(得分:0)
这取决于您使用的适配器。如果使用Zend_Paginator_Adapter_Array
,则zend paginator将按数组长度计算页面范围等。但是如果使用Zend_Paginator_Adapter_DbSelect
,zend paginator将根据您的查询自动创建查询select count(*) ...... as zend_paginator_row_count
以计算行数,并且不会加载所有数据库结果。
答案 4 :(得分:0)
Zend_Db_Select和Zend_Db_Table_Select是解决问题的好方法,也是我六个月前不得不处理的问题。
假设我的数据库中有一个书籍表,我定义了一个搜索功能,允许我在整个表格的字段中进行全文搜索:
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);
}