From ae198d5e4567716681d8124924637aadb3772aed Mon Sep 17 00:00:00 2001 From: Merixstudio Date: Mon, 24 Nov 2014 15:27:15 +0100 Subject: [PATCH] Allowed to get count query from paginator. --- .../ORM/Tools/Pagination/Paginator.php | 65 ++++++++++--------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/lib/Doctrine/ORM/Tools/Pagination/Paginator.php b/lib/Doctrine/ORM/Tools/Pagination/Paginator.php index 117690cb2..3139ce706 100755 --- a/lib/Doctrine/ORM/Tools/Pagination/Paginator.php +++ b/lib/Doctrine/ORM/Tools/Pagination/Paginator.php @@ -118,38 +118,8 @@ class Paginator implements \Countable, \IteratorAggregate public function count() { if ($this->count === null) { - /* @var $countQuery Query */ - $countQuery = $this->cloneQuery($this->query); - - if ( ! $countQuery->hasHint(CountWalker::HINT_DISTINCT)) { - $countQuery->setHint(CountWalker::HINT_DISTINCT, true); - } - - if ($this->useOutputWalker($countQuery)) { - $platform = $countQuery->getEntityManager()->getConnection()->getDatabasePlatform(); // law of demeter win - - $rsm = new ResultSetMapping(); - $rsm->addScalarResult($platform->getSQLResultCasing('dctrn_count'), 'count'); - - $countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\CountOutputWalker'); - $countQuery->setResultSetMapping($rsm); - } else { - $this->appendTreeWalker($countQuery, 'Doctrine\ORM\Tools\Pagination\CountWalker'); - } - - $countQuery->setFirstResult(null)->setMaxResults(null); - + $countQuery = $this->getCountQuery(); try { - $parser = new Query\Parser($countQuery); - $parameterMappings = $parser->parse($parser)->getParameterMappings(); - $parameters = $countQuery->getParameters(); - foreach($parameters as $k=>$param){ - if(!array_key_exists($param->getName(), $parameterMappings)){ - $parameters->remove($k); - } - } - $countQuery->setParameters($parameters); - $data = $countQuery->getScalarResult(); $data = array_map('current', $data); $this->count = array_sum($data); @@ -161,6 +131,39 @@ class Paginator implements \Countable, \IteratorAggregate return $this->count; } + public function getCountQuery(){ + /* @var $countQuery Query */ + $countQuery = $this->cloneQuery($this->query); + + if ( ! $countQuery->hasHint(CountWalker::HINT_DISTINCT)) { + $countQuery->setHint(CountWalker::HINT_DISTINCT, true); + } + + if ($this->useOutputWalker($countQuery)) { + $platform = $countQuery->getEntityManager()->getConnection()->getDatabasePlatform(); // law of demeter win + + $rsm = new ResultSetMapping(); + $rsm->addScalarResult($platform->getSQLResultCasing('dctrn_count'), 'count'); + + $countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\CountOutputWalker'); + $countQuery->setResultSetMapping($rsm); + } else { + $this->appendTreeWalker($countQuery, 'Doctrine\ORM\Tools\Pagination\CountWalker'); + } + + $countQuery->setFirstResult(null)->setMaxResults(null); + $parser = new Query\Parser($countQuery); + $parameterMappings = $parser->parse($parser)->getParameterMappings(); + $parameters = $countQuery->getParameters(); + foreach($parameters as $k=>$param){ + if(!array_key_exists($param->getName(), $parameterMappings)){ + $parameters->remove($k); + } + } + $countQuery->setParameters($parameters); + return $countQuery; + } + /** * {@inheritdoc} */