5

を使用している場合、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エンティティのみを読み込むにはどうすればよいですか?

4

1 に答える 1

5

Doctrine のページネーション用の Zend ページネーション アダプター ラッパーを作成することで、これを解決しました。

<?php
class PaginatorAdapter extends Doctrine\ORM\Tools\Pagination\Paginator implements
        Zend_Paginator_Adapter_Interface
{
    public function getItems($offset, $itemCountPerPage)
    {
        $this->getQuery()->setFirstResult($offset)->setMaxResults($itemCountPerPage);
        return $this->getQuery()->getResult($this->getQuery()->getHydrationMode());
    }
}
于 2012-06-09T17:39:29.867 に答える