如何在不加载数据库的所有结果的情况下使用Zend分页



我对Zend框架比较陌生,可能只使用了一个月。我有一个查询运行得太慢了。页面加载需要几分钟时间。在我的查询中,它是抓取了所有记录,还是只获取了页面所需的数量?我可以限制从数据库中提取内容吗?

我的代码如下。

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

如果你能给我任何帮助,我将不胜感激。

因为您正在向分页器工厂提供Db查询,所以分页器在大多数情况下都会使用DbSelect分页器适配器。这个适配器将使最小的查询尽可能满足寻呼器的需求

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

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

摘录自参考资料:

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

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

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

注意:

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

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

相关内容

最新更新