vendor/knplabs/knp-components/src/Knp/Component/Pager/Event/Subscriber/Paginate/Doctrine/DBALQueryBuilderSubscriber.php line 16

Open in your IDE?
  1. <?php
  2. namespace Knp\Component\Pager\Event\Subscriber\Paginate\Doctrine;
  3. use Doctrine\DBAL\Query\QueryBuilder;
  4. use Knp\Component\Pager\Event\ItemsEvent;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. /**
  7.  * DBALQueryBuilderSubscriber.php
  8.  *
  9.  * @author Vladimir Chub <v@chub.com.ua>
  10.  */
  11. class DBALQueryBuilderSubscriber implements EventSubscriberInterface
  12. {
  13.     public function items(ItemsEvent $event): void
  14.     {
  15.         if ($event->target instanceof QueryBuilder) {
  16.             /** @var QueryBuilder $target */
  17.             $target $event->target;
  18.         
  19.             // count results
  20.             $qb = clone $target;
  21.             
  22.             //reset count orderBy since it can break query and slow it down
  23.             $qb
  24.                 ->resetQueryPart('orderBy')
  25.             ;
  26.             
  27.             // get the query
  28.             $sql $qb->getSQL();
  29.             
  30.             $qb
  31.                 ->resetQueryParts()
  32.                 ->select('count(*) as cnt')
  33.                 ->from('(' $sql ')''dbal_count_tbl')
  34.             ;
  35.             $compat $qb->execute();
  36.             $event->count method_exists($compat'fetchColumn') ? $compat->fetchColumn(0) : $compat->fetchOne();
  37.             // if there is results
  38.             $event->items = [];
  39.             if ($event->count) {
  40.                 $qb = clone $target;
  41.                 $qb
  42.                     ->setFirstResult($event->getOffset())
  43.                     ->setMaxResults($event->getLimit())
  44.                 ;
  45.                 
  46.                 $event->items $qb
  47.                     ->execute()
  48.                     ->fetchAll()
  49.                 ;
  50.             }
  51.             
  52.             $event->stopPropagation();
  53.         }
  54.     }
  55.     public static function getSubscribedEvents(): array
  56.     {
  57.         return [
  58.             'knp_pager.items' => ['items'10 /*make sure to transform before any further modifications*/],
  59.         ];
  60.     }
  61. }