diff --git a/src/Tools/Pagination/LimitSubqueryOutputWalker.php b/src/Tools/Pagination/LimitSubqueryOutputWalker.php index 95b9066db2b..ea7ec0f630d 100644 --- a/src/Tools/Pagination/LimitSubqueryOutputWalker.php +++ b/src/Tools/Pagination/LimitSubqueryOutputWalker.php @@ -105,17 +105,24 @@ public function __construct($query, $parserResult, array $queryComponents) $this->platform = $query->getEntityManager()->getConnection()->getDatabasePlatform(); $this->rsm = $parserResult->getResultSetMapping(); - $query = clone $query; + $cloneQuery = clone $query; + + $cloneQuery->setParameters(clone $query->getParameters()); + $cloneQuery->setCacheable(false); + + foreach ($query->getHints() as $name => $value) { + $cloneQuery->setHint($name, $value); + } // Reset limit and offset - $this->firstResult = $query->getFirstResult(); - $this->maxResults = $query->getMaxResults(); - $query->setFirstResult(0)->setMaxResults(null); + $this->firstResult = $cloneQuery->getFirstResult(); + $this->maxResults = $cloneQuery->getMaxResults(); + $cloneQuery->setFirstResult(0)->setMaxResults(null); - $this->em = $query->getEntityManager(); + $this->em = $cloneQuery->getEntityManager(); $this->quoteStrategy = $this->em->getConfiguration()->getQuoteStrategy(); - parent::__construct($query, $parserResult, $queryComponents); + parent::__construct($cloneQuery, $parserResult, $queryComponents); } /** diff --git a/tests/Tests/ORM/Functional/EagerFetchCollectionTest.php b/tests/Tests/ORM/Functional/EagerFetchCollectionTest.php index 88397c6a12f..3a21a93831c 100644 --- a/tests/Tests/ORM/Functional/EagerFetchCollectionTest.php +++ b/tests/Tests/ORM/Functional/EagerFetchCollectionTest.php @@ -7,9 +7,11 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Query\QueryException; +use Doctrine\ORM\Tools\Pagination\Paginator; use Doctrine\Tests\OrmFunctionalTestCase; use function count; +use function iterator_to_array; class EagerFetchCollectionTest extends OrmFunctionalTestCase { @@ -96,6 +98,16 @@ public function testSubselectFetchJoinWithAllowedWhenOverriddenNotEager(): void $this->assertIsString($query->getSql()); } + public function testSubselectFetchJoinWithAllowedWhenOverriddenNotEagerPaginator(): void + { + $query = $this->_em->createQuery('SELECT o, c FROM ' . EagerFetchOwner::class . ' o JOIN o.children c WITH c.id = 1'); + $query->setMaxResults(1); + $query->setFetchMode(EagerFetchChild::class, 'owner', ORM\ClassMetadata::FETCH_LAZY); + + $paginator = new Paginator($query, true); + $this->assertIsArray(iterator_to_array($paginator)); + } + public function testEagerFetchWithIterable(): void { $this->createOwnerWithChildren(2); diff --git a/tests/Tests/ORM/Tools/Pagination/LimitSubqueryOutputWalkerTest.php b/tests/Tests/ORM/Tools/Pagination/LimitSubqueryOutputWalkerTest.php index 95d2047d593..9a6138ae03f 100644 --- a/tests/Tests/ORM/Tools/Pagination/LimitSubqueryOutputWalkerTest.php +++ b/tests/Tests/ORM/Tools/Pagination/LimitSubqueryOutputWalkerTest.php @@ -46,6 +46,22 @@ private function replaceDatabasePlatform(AbstractPlatform $platform): void $this->entityManager->getConnection()->setDatabasePlatform($platform); } + public function testSubqueryClonedCompletely(): void + { + $query = $this->createQuery('SELECT p FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p'); + $query->setParameter('dummy-param', 123); + $query->setHint('dummy-hint', 'dummy-value'); + $query->setCacheable(true); + + $walker = new LimitSubqueryOutputWalker($query, new Query\ParserResult(), []); + + self::assertTrue($walker->getQuery()->hasHint('dummy-hint')); + self::assertSame('dummy-value', $walker->getQuery()->getHint('dummy-hint')); + self::assertInstanceOf(Query\Parameter::class, $param = $walker->getQuery()->getParameter('dummy-param')); + self::assertSame(123, $param->getValue()); + self::assertFalse($walker->getQuery()->isCacheable()); + } + public function testLimitSubquery(): void { $query = $this->createQuery('SELECT p, c, a FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p JOIN p.category c JOIN p.author a');