6

我即将在我的项目中使用 Zend_Paginator 类。我在互联网上找到了该课程的示例。其中之一是

$sql = 'SELECT * FROM table_name ';    
$result = $db->fetchAll($sql);    
$page=$this->_getParam('page',1);    
$paginator = Zend_Paginator::factory($result);   
 $paginator->setItemCountPerPage(10));   
 $paginator->setCurrentPageNumber($page);   
 $this->view->paginator=$paginator;

在第一行,它实际上选择了 table_name 中的所有行。如果我有一个有 50000 行的表怎么办?那将是非常低效的。

还有其他使用 Zend Paginator 的方法吗?

4

2 回答 2

12

关于这个问题,您可能会对手册的这一部分感兴趣:39.2.2。DbSelect 和 DbTableSelect 适配器,它声明(引用,强调我的)

...数据库适配器需要更详细的解释。
与普遍认为的相反,这些适配器不会从数据库中获取所有记录来对它们进行计数。

相反,适配器操纵原始查询以产生相应的 COUNT查询。
Paginator 然后执行该COUNT查询以获取行数。

这确实需要对数据库进行额外的往返,但这比获取整个结果集并使用count().
尤其是对于大量数据。

(该页面上还有更多要阅读的内容——并且有一个示例可以为您提供更多信息)


这个想法是您将不再自己获取所有数据,但您会告诉Zend_Paginator它必须使用哪个适配器来访问您的数据。

该适配器将特定于“通过 SQL 查询获取的数据”,并且将知道如何直接在数据库端对其进行分页——这意味着只获取所需的内容,而不是像您最初那样获取所有数据。

于 2009-12-01T22:44:47.400 回答
7

我建议传递一个Zend_Db_Select对象Zend_Paginator::factory($select);而不是传递一个结果行集。否则,您将选择整个结果集,然后进行分页。在您当前的解决方案中,如果您有一百万行,您将在获取当前页面定义的行块之前选择所有行。

于 2009-12-01T23:06:27.837 回答