如何在不加载db的所有结果的情况下使用Zend paginate?

时间:2012-11-28 06:14:37

标签: php database zend-framework

我对The Zend框架相对较新,可能只用了1个月。我的查询运行速度太慢。该页面需要几分钟才能加载。在我的查询中,它是抓取所有记录还是仅获得我需要的页面数量?我可以应用限制从数据库中获取内容吗?

我的代码如下。

public function init() {
  $db = Zend_Registry::get('db');
  $sql = 'SELECT * FROM employee ';
  $result = $db->fetchAll($sql);
  $page=$this->_getParam('page',1);
  $paginator = Zend_Paginator::factory($result);
  $paginator->setItemCountPerPage(5);
  $paginator->setCurrentPageNumber($page);
  $this->view->paginator=$paginator;        
}

我会很乐意为你提供任何帮助。

1 个答案:

答案 0 :(得分:0)

因为您向Paginator工厂提供Db查询,所以Paginator在大多数情况下会使用DbSelect Paginator适配器。该适配器将使最小的查询成为可能,以满足对Paginator的要求。

为确保Paginator使用正确的适配器,您可以传递一个字符串作为第二个arg。

$paginator = Zend_Paginator::factory($result, 'DbSelect');

摘自参考文献:

  

注意:而不是选择给定查询的每个匹配行   DbSelect和DbTableSelect适配器仅检索最小量   显示当前页面所需的数据。

     

因此,动态生成第二个查询以确定   匹配行的总数。但是,可以直接进行   自己提供计数或计数查询。请参阅setRowCount()方法   在DbSelect适配器中获取更多信息。

如果使用数据库分析,则可以看到生成限制和偏移查询的位置。

注意:

在大多数情况下,Zend_Db会将SQL select查询转换为Zend_Db_Select对象。如果您发现自己处于极少数情况下并非如此,则需要使用Paginator的数组适配器或将sql重构为Zend_Db_Select对象。这应该是非常罕见的。

在init()方法中看到一个paginator实例也很不寻常。 init()将在对该控制器的每个请求上运行。