を使用している場合、Doctrine 2 のパフォーマンスに苦労していHYDRATE_OBJECT
ます。HYDRATE_ARRAY
からに切り替えるとHYDRATE_OBJECT
、10 倍近く時間がかかります。doctrine 2 と zend paginatorを参照として使用しました。
$query = $em->createQuery($dql)
->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY)
->setParameter('x', 1);
// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 160 ms
対
$query = $em->createQuery($dql)
->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_OBJECT)
->setParameter('x', 1);
// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 1.4s
何に気をつければいいですか?処理時間を短縮して利用するにはHYDRATE_OBJECT
?ページネーションを達成するためのより良い方法はありますか?
*編集:使用->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage);
すると読み込み時間が大幅に短縮されますが、使用すると$iterator
:
$adapter = new \Zend_Paginator_Adapter_Iterator($iterator);
$zend_paginator = new \Zend_Paginator($adapter);
$zend_paginator->setItemCountPerPage($itemsPerPage)
->setCurrentPageNumber($page);
Zend は$itemsPerPage
, ( count($iterator) == $itemsPerPage
) しか認識していないため、ページネーション リンクは常に 1 ページのみを計算します。Zend_Paginator を使用して適切なページネーションを実現し、$itemsPerPage
エンティティのみを読み込むにはどうすればよいですか?