как улучшить производительность пагинации zend paginator - PullRequest
0 голосов
/ 02 февраля 2012

Я создал Zend_Paginator на основе AJAX, однако я не хочу получать все записи из запроса. Например; У меня есть десять элементов на странице, поэтому я хочу, чтобы мой запрос извлекал только 10 строк.

Вот код: -

$request = $this->getRequest();
$phone_service_id  =  $request->getParam("id");
$registry = Zend_Registry::getInstance();  
$DB = $registry['DB'];
$sql ="SELECT caller_name,call_number,call_start_time,call_duration,call_direction
       FROM CALL_LOG
       WHERE phone_service_id = $phone_service_id";
$result = $DB->fetchAll($sql);
$page=$this->_getParam('page',1);
$paginator = Zend_Paginator::factory($result);
$paginator->setItemCountPerPage(10);
$paginator->setCurrentPageNumber($page);
$this->view->paginator=$paginator;
$page = $paginator->getCurrentPageNumber();
$perPage = $paginator->getItemCountPerPage();
$total = $paginator->getTotalItemCount();
$A = ($page - 1) * $perPage + 1;
$B = min($A + $perPage - 1, $total);
$C = $total;
$this->view->assign('url', $request->getBaseURL());
$this->view->assign('total',$total );
$this->view->assign('page',$page );
$this->view->assign('A',$A );
$this->view->assign('B',$B );
$this->view->assign('C',$C );

Как я могу ограничить свой запрос, чтобы он сначала извлекал 10 строк для первой страницы, а если для второй страницы - только от 11 до 20 строк и так далее?

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

Вы можете сделать что-то вроде этого

$select = $DB->select()
             ->from('CALL_LOG', array('caller_name','call_number','call_start_time','call_duration','call_direction'))
             ->where('phone_service_id = ?', $phone_service_id);
$adapter = new Zend_Paginator_Adapter_DbSelect($select);
$paginator = new Zend_Paginator($adapter);

, а затем остаток вашего кода.

2 голосов
/ 02 февраля 2012

Сформируйте ваш запрос к объекту Zend_Db_Select. Затем используйте Zend_Paginator_Adapter_DbSelect. Он автоматически добавит лимит и смещение к вашему запросу.

1 голос
/ 02 февраля 2012

Если вы посмотрите на страницу руководства Zend_Paginator , вы увидите, что требуемое поведение уже встроено, если вы предоставите Zend_Paginator объект Zend_Select.На данный момент вы предоставляете ему массив .

. Чтобы изменить это, вы должны изменить свой код следующим образом: -

$request = $this->getRequest();
$phone_service_id  =  $request->getParam("id");

//altered code follows
$select = new Zend_Db_Select(Zend_Db_Table::getDefaultAdapter());
$select = $DB->select()
         ->from('CALL_LOG', array(
                'caller_name',
                'call_number',
                'call_start_time',
                'call_duration',
                'call_direction'))
         ->where('phone_service_id = ?', $phone_service_id);
$paginator = Zend_Paginator::factory($select);
//End of altered code

$paginator->setItemCountPerPage(10);
$page=$this->_getParam('page',1);
$paginator->setCurrentPageNumber($page);
$this->view->paginator=$paginator;
$page = $paginator->getCurrentPageNumber();
$perPage = $paginator->getItemCountPerPage();
$total = $paginator->getTotalItemCount();
$A = ($page - 1) * $perPage + 1;
$B = min($A + $perPage - 1, $total);
$C = $total;
$this->view->assign('url', $request->getBaseURL());
$this->view->assign('total',$total );
$this->view->assign('page',$page );
$this->view->assign('A',$A );
$this->view->assign('B',$B );
$this->view->assign('C',$C );

Теперь Zend_Paginator будет присматриватьзапросы к вашей базе данных по мере необходимости.
Предварительным условием успешного использования Zend Framework является прочтение руководства и API-документации , с которой вы действительно будете бороться без.

Лично я нашел лучшую документацию для кода, вы должны прочитать ее для любого компонента, который вы используете в то время, вы многому научитесь.

Обратите внимание, у меня естьЯ не смог протестировать этот код, но я не вижу причин, по которым он не должен работать.

...