vendor/knplabs/knp-components/src/Knp/Component/Pager/Event/Subscriber/Paginate/Doctrine/ORM/QuerySubscriber.php line 28

Open in your IDE?
  1. <?php
  2. namespace Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM;
  3. use Knp\Component\Pager\PaginatorInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Doctrine\ORM\Query\Parameter;
  6. use Knp\Component\Pager\Event\ItemsEvent;
  7. use Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM\Query\Helper as QueryHelper;
  8. use Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM\Query\CountWalker;
  9. use Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM\Query\WhereInWalker;
  10. use Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM\Query\LimitSubqueryWalker;
  11. use Doctrine\ORM\Query;
  12. use Doctrine\ORM\Tools\Pagination\CountWalker as DoctrineCountWalker;
  13. use Doctrine\ORM\Tools\Pagination\WhereInWalker as DoctrineWhereInWalker;
  14. use Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker as DoctrineLimitSubqueryWalker;
  15. /**
  16.  * @deprecated see UsesPaginator
  17.  **/
  18. class QuerySubscriber implements EventSubscriberInterface
  19. {
  20.     /**
  21.      * Used if user set the count manually
  22.      */
  23.     const HINT_COUNT 'knp_paginator.count';
  24.     public function items(ItemsEvent $event)
  25.     {
  26.         if ($event->target instanceof Query) {
  27.             // process count
  28.             $useDoctrineWalkers false;
  29.             $useDoctrineOutputWalker false;
  30.             if (version_compare(\Doctrine\ORM\Version::VERSION'2.3.0''>=')) {
  31.                 $useDoctrineWalkers true;
  32.                 $useDoctrineOutputWalker true;
  33.             } else if (version_compare(\Doctrine\ORM\Version::VERSION'2.2.0''>=')) {
  34.                 $useDoctrineWalkers true;
  35.             }
  36.             if (($count $event->target->getHint(self::HINT_COUNT)) !== false) {
  37.                 $event->count intval($count);
  38.             } else {
  39.                 $countQuery QueryHelper::cloneQuery($event->target);
  40.                 if ($useDoctrineOutputWalker) {
  41.                     $treeWalker 'Doctrine\ORM\Tools\Pagination\CountOutputWalker';
  42.                     $countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER$treeWalker);
  43.                 } else if ($useDoctrineWalkers) {
  44.                     QueryHelper::addCustomTreeWalker($countQuery'Doctrine\ORM\Tools\Pagination\CountWalker');
  45.                 } else {
  46.                     $treeWalker 'Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM\Query\CountWalker';
  47.                     QueryHelper::addCustomTreeWalker($countQuery$treeWalker);
  48.                 }
  49.                 if ($useDoctrineWalkers) {
  50.                     $countQuery->setHint(
  51.                         DoctrineCountWalker::HINT_DISTINCT,
  52.                         $event->options[PaginatorInterface::DISTINCT]
  53.                     );
  54.                 } else {
  55.                     $countQuery->setHint(
  56.                         CountWalker::HINT_DISTINCT,
  57.                         $event->options[PaginatorInterface::DISTINCT]
  58.                     );
  59.                 }
  60.                 $countQuery
  61.                     ->setFirstResult(null)
  62.                     ->setMaxResults(null)
  63.                 ;
  64.                 $countQuery->getEntityManager()->getConfiguration()->addCustomHydrationMode('asIs',
  65.                             'Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM\Query\AsIsHydrator');
  66.                 $countResult $countQuery->getResult('asIs');
  67.                 $event->count intval(current(current($countResult)));
  68.             }
  69.             // process items
  70.             $result null;
  71.             if ($event->count) {
  72.                 if ($event->options[PaginatorInterface::DISTINCT]) {
  73.                     $limitSubQuery QueryHelper::cloneQuery($event->target);
  74.                     $limitSubQuery
  75.                         ->setFirstResult($event->getOffset())
  76.                         ->setMaxResults($event->getLimit())
  77.                         ->useQueryCache(false)
  78.                     ;
  79.                     QueryHelper::addCustomTreeWalker($limitSubQuery$useDoctrineWalkers ?
  80.                         'Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker' :
  81.                         'Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM\Query\LimitSubqueryWalker'
  82.                     );
  83.                     $ids array_map('current'$limitSubQuery->getScalarResult());
  84.                     // create where-in query
  85.                     $whereInQuery QueryHelper::cloneQuery($event->target);
  86.                     QueryHelper::addCustomTreeWalker($whereInQuery$useDoctrineWalkers ?
  87.                         'Doctrine\ORM\Tools\Pagination\WhereInWalker' :
  88.                         'Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine\ORM\Query\WhereInWalker'
  89.                     );
  90.                     $whereInQuery
  91.                         ->setHint($useDoctrineWalkers ?
  92.                             DoctrineWhereInWalker::HINT_PAGINATOR_ID_COUNT :
  93.                             WhereInWalker::HINT_PAGINATOR_ID_COUNTcount($ids)
  94.                         )
  95.                         ->setFirstResult(null)
  96.                         ->setMaxResults(null)
  97.                     ;
  98.                     if (version_compare(\Doctrine\ORM\Version::VERSION'2.3.0''>=') && count($ids) > 0) {
  99.                         $whereInQuery->setParameter(WhereInWalker::PAGINATOR_ID_ALIAS$ids);
  100.                     } else {
  101.                         $type $limitSubQuery->getHint($useDoctrineWalkers ?
  102.                             DoctrineLimitSubqueryWalker::IDENTIFIER_TYPE :
  103.                             LimitSubqueryWalker::IDENTIFIER_TYPE
  104.                         );
  105.                         $idAlias $useDoctrineWalkers ?
  106.                             DoctrineWhereInWalker::PAGINATOR_ID_ALIAS :
  107.                             WhereInWalker::PAGINATOR_ID_ALIAS
  108.                         ;
  109.                         foreach ($ids as $i => $id) {
  110.                             $whereInQuery->setParameter(
  111.                                 $idAlias '_' . ++$i,
  112.                                 $id,
  113.                                 $type->getName()
  114.                             );
  115.                         }
  116.                     }
  117.                     $result $whereInQuery->execute();
  118.                 } else {
  119.                     $event->target
  120.                         ->setFirstResult($event->getOffset())
  121.                         ->setMaxResults($event->getLimit())
  122.                     ;
  123.                     $result $event->target->execute();
  124.                 }
  125.             } else {
  126.                 $result = array(); // count is 0
  127.             }
  128.             $event->items $result;
  129.             $event->stopPropagation();
  130.         }
  131.     }
  132.     public static function getSubscribedEvents()
  133.     {
  134.         return array(
  135.             'knp_pager.items' => array('items'0)
  136.         );
  137.     }
  138. }