Skip to content

Commit 9270385

Browse files
committed
Avoid to truncate WHERE clauses when clonning the querybuilder
1 parent 8e9ae21 commit 9270385

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
1515
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
16+
use Doctrine\ORM\Query\Expr;
1617
use Doctrine\ORM\Query\Expr\Join;
1718
use Doctrine\ORM\QueryBuilder;
1819

@@ -102,8 +103,17 @@ private function getQueryBuilderWithNewAliases(QueryBuilder $queryBuilder, Query
102103
}
103104

104105
//Change where aliases
105-
foreach ($wherePart->getParts() as $where) {
106-
$queryBuilderClone->add('where', str_replace($aliases, $replacements, $where));
106+
switch (true) {
107+
case $wherePart instanceof Expr\Orx:
108+
foreach ($wherePart->getParts() as $where) {
109+
$queryBuilderClone->orWhere(str_replace($aliases, $replacements, $where));
110+
}
111+
break;
112+
case $wherePart instanceof Expr\Andx:
113+
foreach ($wherePart->getParts() as $where) {
114+
$queryBuilderClone->andWhere(str_replace($aliases, $replacements, $where));
115+
}
116+
break;
107117
}
108118

109119
return $queryBuilderClone;

tests/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtensionTest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,58 @@ public function testApplyCollection()
129129

130130
$this->assertEquals('SELECT o FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar o LEFT JOIN o.colors colors WHERE o IN(SELECT o_2 FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar o_2 LEFT JOIN o_2.colors colors_2 WHERE o_2.colors = :foo)', $qb->getDQL());
131131
}
132+
133+
public function testApplyCollectionWithWhereOrClauses()
134+
{
135+
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
136+
$resourceMetadataFactoryProphecy->create(DummyCar::class)->willReturn(new ResourceMetadata(DummyCar::class));
137+
138+
$em = $this->prophesize(EntityManager::class);
139+
$em->getExpressionBuilder()->shouldBeCalled()->willReturn(new Expr());
140+
141+
$qb = new QueryBuilder($em->reveal());
142+
143+
$qb->select('o')
144+
->from(DummyCar::class, 'o')
145+
->leftJoin('o.colors', 'colors')
146+
->where('o.colors = :foo')
147+
->orWhere('o.colors = :bar')
148+
->setParameter('foo', 1)
149+
->setParameter('bar', 2);
150+
151+
$queryNameGenerator = $this->prophesize(QueryNameGeneratorInterface::class);
152+
$queryNameGenerator->generateJoinAlias('colors')->shouldBeCalled()->willReturn('colors_2');
153+
154+
$filterEagerLoadingExtension = new FilterEagerLoadingExtension($resourceMetadataFactoryProphecy->reveal(), true);
155+
$filterEagerLoadingExtension->applyToCollection($qb, $queryNameGenerator->reveal(), DummyCar::class, 'get');
156+
157+
$this->assertEquals('SELECT o FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar o LEFT JOIN o.colors colors WHERE o IN(SELECT o_2 FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar o_2 LEFT JOIN o_2.colors colors_2 WHERE o_2.colors = :foo OR o_2.colors = :bar)', $qb->getDQL());
158+
}
159+
160+
public function testApplyCollectionWithWhereAndClauses()
161+
{
162+
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
163+
$resourceMetadataFactoryProphecy->create(DummyCar::class)->willReturn(new ResourceMetadata(DummyCar::class));
164+
165+
$em = $this->prophesize(EntityManager::class);
166+
$em->getExpressionBuilder()->shouldBeCalled()->willReturn(new Expr());
167+
168+
$qb = new QueryBuilder($em->reveal());
169+
170+
$qb->select('o')
171+
->from(DummyCar::class, 'o')
172+
->leftJoin('o.colors', 'colors')
173+
->where('o.colors = :foo')
174+
->andWhere('o.colors = :bar')
175+
->setParameter('foo', 1)
176+
->setParameter('bar', 2);
177+
178+
$queryNameGenerator = $this->prophesize(QueryNameGeneratorInterface::class);
179+
$queryNameGenerator->generateJoinAlias('colors')->shouldBeCalled()->willReturn('colors_2');
180+
181+
$filterEagerLoadingExtension = new FilterEagerLoadingExtension($resourceMetadataFactoryProphecy->reveal(), true);
182+
$filterEagerLoadingExtension->applyToCollection($qb, $queryNameGenerator->reveal(), DummyCar::class, 'get');
183+
184+
$this->assertEquals('SELECT o FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar o LEFT JOIN o.colors colors WHERE o IN(SELECT o_2 FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar o_2 LEFT JOIN o_2.colors colors_2 WHERE o_2.colors = :foo AND o_2.colors = :bar)', $qb->getDQL());
185+
}
132186
}

0 commit comments

Comments
 (0)