0

我对 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;        
}

我会很感激你能给我的任何帮助。

4

1 回答 1

0

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

为了确保分页器使用正确的适配器,您可以传递一个字符串作为第二个参数。

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

参考资料摘录:

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

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

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

笔记:

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

在 init() 方法中看到分页器实例也是相当不寻常的。init() 将在对该控制器的每个请求上运行。

于 2012-11-28T09:14:51.033 回答