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

  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.             $target $event->target;
  17.         
  18.             // count results
  19.             $qb = clone $target;
  20.             
  21.             //reset count orderBy since it can break query and slow it down
  22.             if (method_exists($qb'resetOrderBy')) {
  23.                 $qb->resetOrderBy();
  24.             } else {
  25.                 $qb->resetQueryParts(['orderBy']);
  26.             }
  27.             // get the query
  28.             $sql $qb->getSQL();
  29.             $qb
  30.                 ->select('count(*) as cnt')
  31.             ;
  32.             $compat $qb->executeQuery();
  33.             $event->count method_exists($compat'fetchColumn') ? $compat->fetchColumn(0) : $compat->fetchOne();
  34.             // if there is results
  35.             $event->items = [];
  36.             if ($event->count) {
  37.                 $qb = clone $target;
  38.                 $qb
  39.                     ->setFirstResult($event->getOffset())
  40.                     ->setMaxResults($event->getLimit())
  41.                 ;
  42.                 
  43.                 $event->items $qb
  44.                     ->executeQuery()
  45.                     ->fetchAllAssociative()
  46.                 ;
  47.             }
  48.             
  49.             $event->stopPropagation();
  50.         }
  51.     }
  52.     public static function getSubscribedEvents(): array
  53.     {
  54.         return [
  55.             'knp_pager.items' => ['items'10 /*make sure to transform before any further modifications*/],
  56.         ];
  57.     }
  58. }