2015-05-01 5 views
0

Я реализовал страницу zf2 paginator. Но теперь, когда данные увеличились, я понял, что сначала извлекает все записи, а затем разбивается на страницы, что занимает больше времени. Я не осознавал проблему скорости, пока записи не переместились более чем на 1к.Zf2 Pagination выбирает все записи

Действительно ли paginator работает так, или мне что-то не хватает в моем коде?

$photos = $em->getRepository('User\Entity\MyEntity')->findBy(array('id' => $main_id, 'status' => '1', 'is_primary' => '1')); 

/** Create Paginator * */ 
$paginator = new \Zend\Paginator\Paginator(new 
       \Zend\Paginator\Adapter\ArrayAdapter($photos) 
      ); 

if (isset($data['pg_id'])) { 
     $paginator->setCurrentPageNumber($data['pg_id']); 
} else { 
     $paginator->setCurrentPageNumber(1); 
} 
$paginator->setDefaultItemCountPerPage(25); 
+0

Я не слишком хорошо знакомы с доктриной (или любой другой ORM, который вы используете), но не первая линия принести много данных? Я фактически обнаружил, что использую адаптер ['NullFill'] (http://framework.zend.com/manual/current/en/modules/zend.paginator.usage.html) (я думаю, что он был вызван просто« null » адаптер перед). Ему не нужны фактические данные, только общее количество элементов (и запрос количества в индексированном поле быстрее, чем выборка всех данных). – guessimtoolate

+3

Вы пытались использовать [адаптер уклонения для доктрины] (https://github.com/doctrine/DoctrineModule/blob/master/docs/paginator.md) вместо ArrayAdapter? – edigu

ответ

0

Как @foozy упоминалась в комментариях, Доктрина предусматривает Paginator адаптеры для ZF2 для этой цели. Вы можете использовать the Selectable adapter from DoctrineModule напрямую или the DoctrinePaginator class from DoctrineORMModule. Последнее не имеет своей собственной документации, но this blog post from Loft Digital explains it well:

use DoctrineORMModule\Paginator\Adapter\DoctrinePaginator as DoctrineAdapter; 
use Doctrine\ORM\Tools\Pagination\Paginator as ORMPaginator; 
use Zend\Paginator\Paginator; 

// ....... 

$entityManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); 
$repository = $entityManager->getRepository('Admin\Entity\SystemUser'); 
$adapter = new DoctrineAdapter(new ORMPaginator($repository->createQueryBuilder('user'))); 
$paginator = new Paginator($adapter); 

// ....... 
+0

Кажется, это хорошо, но где я могу передать свою статью? –

+0

В этом примере он передается в конструктор ORMPaginator. Он ожидает запрос Doctrine, в этом случае построенный с помощью Query Builder (http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html) –