Performance zend分页,而不重新获取每个页面的查询
每次我从寻呼机请求页面时,是否可以在不调用查询的情况下使用zend分页 当我从寻呼机中点击一个页码时,对下面的Z操作的请求就完成了,并且再次获取查询。我的查询量很大,我不想再次获取查询。我在代码中遗漏了什么 代码: 控制器:Performance zend分页,而不重新获取每个页面的查询,performance,zend-framework,pagination,Performance,Zend Framework,Pagination,每次我从寻呼机请求页面时,是否可以在不调用查询的情况下使用zend分页 当我从寻呼机中点击一个页码时,对下面的Z操作的请求就完成了,并且再次获取查询。我的查询量很大,我不想再次获取查询。我在代码中遗漏了什么 代码: 控制器: public function getOnePageOfEntries($array, $page=1) { $paginator = Zend_Paginator::factory($array); $paginator->setItemCount
public function getOnePageOfEntries($array, $page=1) {
$paginator = Zend_Paginator::factory($array);
$paginator->setItemCountPerPage(6);
$paginator->setCurrentPageNumber($page);
return $paginator;
}
public function zzAction() {
...
$tt= $this->yyObject->xx(....);
$paginator = $this -> getOnePageOfEntries($tt, $page);
$this->view->paginator = $paginator;
}
型号:
public function xx(...){
try{
...
$stmt = $this->prepare("CALL sp_yy(...)");
....
$stmt->execute();
$result = $stmt->fetchAll();
if (is_null($result)) {
return null;
}
return $result;
}catch (ErrorsException $obj){
echo $obj;exit;
}//end try
}
视图:
使用Zend_Paginator_Adapater_DbSelect() 例如:
$adapter = new Zend_Paginator_Adapter_DbSelect($data); //$data is database query
$pagination = new Zend_Paginator($adapter);
请参阅此处的更多信息:
您当前的代码人为地限制了数组适配器的实用性,并强制您对每个页面执行整个查询。在使用此分页器的控制器操作中,您需要完成的是仅在数据不存在时执行查询。可能类似于:
//consider this to psuedocode as it has not been tested a represents an idea
public function zzAction()
{
//get page number
$page = $this->getRequest()->getParam('page');
//set session namespace, probably better to do this in init() method or bootstrap
$session = new Zend_Session_Namespace('paged')
//test for presence of persisted array
if (!isset($session->paginator)) {
//perform query
$arrayToPage = $this->yyObject->xx(....);
//persist result array
$session->paginator = $arrayToPage;
} else {
//retrieve persisted array
$arrayToPage = $session->paginator;
}
$paginator = $this -> getOnePageOfEntries($arrayToPage, $page);
$this->view->paginator = $paginator;
}
使用DbTableSelect或DbSelect paginator适配器通常效率更高,因为它只查询需要填充特定页面的数据。当用户希望从第1页转到第7页时,这非常有用
使用分页器时的另一个注意事项是自定义实体模型。这在采埃孚很容易处理:
<?php
class Record_Model_Paginator_Record extends Zend_Paginator_Adapter_DbTableSelect
{
//override getItems to customize the adapter to use a specific mapper to create entities
public function getItems($offset, $itemCountPerPage)
{
$rows = parent::getItems($offset, $itemCountPerPage);
$record = array();
foreach ($rows as $row) {
//initiate mapper
$recordEntity = new Application_Model_Mapper_Record();
//create entity models
$record[] = $recordEntity->createEntity($row);
}
//returns an array of objects, similar to a Zend_Db_Rowset object
return $record;
}
}
谢谢。但我担心性能,因为会动态生成第二个查询来确定匹配行的总数(根据提供的链接),并且它会为每个页面再次调用select语句(尽管它只会得到一些记录)。这就是为什么我想使用limit子句只选择一些记录,但我想避免在获取新页面时再次调用该过程。有什么方法可以做到吗?Zend_Paginator_Adapter_DbSelect支持自动限制、偏移。不用担心。它只获取记录数为ItemsCountPerPage的数据,而不获取全部。对不起,我英语说得不好
<?php
class Record_Model_Paginator_Record extends Zend_Paginator_Adapter_DbTableSelect
{
//override getItems to customize the adapter to use a specific mapper to create entities
public function getItems($offset, $itemCountPerPage)
{
$rows = parent::getItems($offset, $itemCountPerPage);
$record = array();
foreach ($rows as $row) {
//initiate mapper
$recordEntity = new Application_Model_Mapper_Record();
//create entity models
$record[] = $recordEntity->createEntity($row);
}
//returns an array of objects, similar to a Zend_Db_Rowset object
return $record;
}
}