public function items(ItemsEvent $event) { if ($event->target instanceof Query) { // process count $useDoctrineWalkers = version_compare(\Doctrine\ORM\Version::VERSION, '2.2.0', '>='); if (($count = $event->target->getHint(self::HINT_COUNT)) !== false) { $event->count = intval($count); } else { $countQuery = QueryHelper::cloneQuery($event->target); QueryHelper::addCustomTreeWalker($countQuery, $useDoctrineWalkers ? 'Doctrine\\ORM\\Tools\\Pagination\\CountWalker' : 'Knp\\Component\\Pager\\Event\\Subscriber\\Paginate\\Doctrine\\ORM\\Query\\CountWalker'); $countQuery->setHint($useDoctrineWalkers ? DoctrineCountWalker::HINT_DISTINCT : CountWalker::HINT_DISTINCT, $event->options['distinct'])->setFirstResult(null)->setMaxResults(null); $countResult = $countQuery->getResult(Query::HYDRATE_ARRAY); if (count($countResult) > 1) { $countResult = count($countResult); } else { $countResult = current($countResult); $countResult = $countResult ? current($countResult) : 0; } $event->count = intval($countResult); } // process items $result = null; if ($event->count) { if ($event->options['distinct']) { $limitSubQuery = QueryHelper::cloneQuery($event->target); $limitSubQuery->setFirstResult($event->getOffset())->setMaxResults($event->getLimit())->useQueryCache(false); QueryHelper::addCustomTreeWalker($limitSubQuery, $useDoctrineWalkers ? 'Doctrine\\ORM\\Tools\\Pagination\\LimitSubqueryWalker' : 'Knp\\Component\\Pager\\Event\\Subscriber\\Paginate\\Doctrine\\ORM\\Query\\LimitSubqueryWalker'); $ids = array_map('current', $limitSubQuery->getScalarResult()); // create where-in query $whereInQuery = QueryHelper::cloneQuery($event->target); QueryHelper::addCustomTreeWalker($whereInQuery, $useDoctrineWalkers ? 'Doctrine\\ORM\\Tools\\Pagination\\WhereInWalker' : 'Knp\\Component\\Pager\\Event\\Subscriber\\Paginate\\Doctrine\\ORM\\Query\\WhereInWalker'); $whereInQuery->setHint($useDoctrineWalkers ? DoctrineWhereInWalker::HINT_PAGINATOR_ID_COUNT : WhereInWalker::HINT_PAGINATOR_ID_COUNT, count($ids))->setFirstResult(null)->setMaxResults(null); $type = $limitSubQuery->getHint($useDoctrineWalkers ? DoctrineLimitSubqueryWalker::IDENTIFIER_TYPE : LimitSubqueryWalker::IDENTIFIER_TYPE); $idAlias = $useDoctrineWalkers ? DoctrineWhereInWalker::PAGINATOR_ID_ALIAS : WhereInWalker::PAGINATOR_ID_ALIAS; foreach ($ids as $i => $id) { $whereInQuery->setParameter($idAlias . '_' . ++$i, $id, $type->getName()); } $result = $whereInQuery->execute(); } else { $event->target->setFirstResult($event->getOffset())->setMaxResults($event->getLimit()); $result = $event->target->execute(); } } else { $result = array(); // count is 0 } $event->items = $result; $event->stopPropagation(); } }
public function items(ItemsEvent $event) { if ($event->target instanceof Query) { // process count $useDoctrineWalkers = false; $useDoctrineOutputWalker = false; if (version_compare(\Doctrine\ORM\Version::VERSION, '2.3.0', '>=')) { $useDoctrineWalkers = true; $useDoctrineOutputWalker = true; } else { if (version_compare(\Doctrine\ORM\Version::VERSION, '2.2.0', '>=')) { $useDoctrineWalkers = true; } } if (($count = $event->target->getHint(self::HINT_COUNT)) !== false) { $event->count = intval($count); } else { $countQuery = QueryHelper::cloneQuery($event->target); if ($useDoctrineOutputWalker) { $treeWalker = 'Doctrine\\ORM\\Tools\\Pagination\\CountOutputWalker'; $countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, $treeWalker); } else { if ($useDoctrineWalkers) { QueryHelper::addCustomTreeWalker($countQuery, 'Doctrine\\ORM\\Tools\\Pagination\\CountWalker'); } else { $treeWalker = 'Knp\\Component\\Pager\\Event\\Subscriber\\Paginate\\Doctrine\\ORM\\Query\\CountWalker'; QueryHelper::addCustomTreeWalker($countQuery, $treeWalker); } } if ($useDoctrineWalkers) { $countQuery->setHint(DoctrineCountWalker::HINT_DISTINCT, $event->options['distinct']); } else { $countQuery->setHint(CountWalker::HINT_DISTINCT, $event->options['distinct']); } $countQuery->setFirstResult(null)->setMaxResults(null); $countQuery->getEntityManager()->getConfiguration()->addCustomHydrationMode('asIs', 'Knp\\Component\\Pager\\Event\\Subscriber\\Paginate\\Doctrine\\ORM\\Query\\AsIsHydrator'); $countResult = $countQuery->getResult('asIs'); $event->count = intval(current(current($countResult))); } // process items $result = null; if ($event->count) { if ($event->options['distinct']) { $limitSubQuery = QueryHelper::cloneQuery($event->target); $limitSubQuery->setFirstResult($event->getOffset())->setMaxResults($event->getLimit())->useQueryCache(false); QueryHelper::addCustomTreeWalker($limitSubQuery, $useDoctrineWalkers ? 'Doctrine\\ORM\\Tools\\Pagination\\LimitSubqueryWalker' : 'Knp\\Component\\Pager\\Event\\Subscriber\\Paginate\\Doctrine\\ORM\\Query\\LimitSubqueryWalker'); $ids = array_map('current', $limitSubQuery->getScalarResult()); // create where-in query $whereInQuery = QueryHelper::cloneQuery($event->target); QueryHelper::addCustomTreeWalker($whereInQuery, $useDoctrineWalkers ? 'Doctrine\\ORM\\Tools\\Pagination\\WhereInWalker' : 'Knp\\Component\\Pager\\Event\\Subscriber\\Paginate\\Doctrine\\ORM\\Query\\WhereInWalker'); $whereInQuery->setHint($useDoctrineWalkers ? DoctrineWhereInWalker::HINT_PAGINATOR_ID_COUNT : WhereInWalker::HINT_PAGINATOR_ID_COUNT, count($ids))->setFirstResult(null)->setMaxResults(null); if (version_compare(\Doctrine\ORM\Version::VERSION, '2.3.0', '>=') && count($ids) > 0) { $whereInQuery->setParameter(WhereInWalker::PAGINATOR_ID_ALIAS, $ids); } else { $type = $limitSubQuery->getHint($useDoctrineWalkers ? DoctrineLimitSubqueryWalker::IDENTIFIER_TYPE : LimitSubqueryWalker::IDENTIFIER_TYPE); $idAlias = $useDoctrineWalkers ? DoctrineWhereInWalker::PAGINATOR_ID_ALIAS : WhereInWalker::PAGINATOR_ID_ALIAS; foreach ($ids as $i => $id) { $whereInQuery->setParameter($idAlias . '_' . ++$i, $id, $type->getName()); } } $result = $whereInQuery->execute(); } else { $event->target->setFirstResult($event->getOffset())->setMaxResults($event->getLimit()); $result = $event->target->execute(); } } else { $result = array(); // count is 0 } $event->items = $result; $event->stopPropagation(); } }