Skip to content

Commit 526edc5

Browse files
author
abluchet
committed
Add test on #1449 query checker order by toMany
1 parent de2c31e commit 526edc5

File tree

3 files changed

+25
-6
lines changed

3 files changed

+25
-6
lines changed

src/Bridge/Doctrine/Orm/Util/QueryChecker.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,17 +146,15 @@ public static function hasOrderByOnToManyJoin(QueryBuilder $queryBuilder, Manage
146146
if (!isset($orderByAliases[$alias])) {
147147
continue;
148148
}
149-
150149
$relationship = QueryJoinParser::getJoinRelationship($join);
151150

152151
if (false !== strpos($relationship, '.')) {
153152
/*
154-
* (Cannot select distinct identifiers from query with LIMIT and ORDER BY on a column from a fetch joined to-many association. Use output walkers)
155-
*
153+
* We select the parent alias because it may differ from the origin alias given above
156154
* @see https://github.com/api-platform/core/issues/1313
157155
*/
158-
list($parentAlias, $association) = explode('.', $relationship);
159-
$metadata = QueryJoinParser::getClassMetadataFromJoinAlias($parentAlias, $queryBuilder, $managerRegistry);
156+
list($relationAlias, $association) = explode('.', $relationship);
157+
$metadata = QueryJoinParser::getClassMetadataFromJoinAlias($relationAlias, $queryBuilder, $managerRegistry);
160158
if ($metadata->isCollectionValuedAssociation($association)) {
161159
return true;
162160
}

tests/Bridge/Doctrine/Orm/Util/QueryCheckerTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,25 @@ public function testHasOrderByOnToManyJoinWithClassLeftJoin()
176176

177177
$this->assertTrue(QueryChecker::hasOrderByOnToManyJoin($queryBuilder->reveal(), $managerRegistry->reveal()));
178178
}
179+
180+
/**
181+
* Adds a test on the fix referenced in https://github.com/api-platform/core/pull/1449.
182+
*/
183+
public function testOrderByOnToManyWithRelationAsBasis()
184+
{
185+
$queryBuilder = $this->prophesize(QueryBuilder::class);
186+
$queryBuilder->getRootEntities()->willReturn(['Dummy']);
187+
$queryBuilder->getRootAliases()->willReturn(['d']);
188+
$queryBuilder->getDQLPart('join')->willReturn(['d' => [new Join('LEFT_JOIN', 'd.relatedDummy', 'a_1')]]);
189+
$queryBuilder->getDQLPart('orderBy')->willReturn(['a_1.name' => new OrderBy('a_1.name', 'asc')]);
190+
$classMetadata = $this->prophesize(ClassMetadata::class);
191+
$classMetadata = $this->prophesize(ClassMetadata::class);
192+
$classMetadata->isCollectionValuedAssociation('relatedDummy')->willReturn(true);
193+
$objectManager = $this->prophesize(ObjectManager::class);
194+
$objectManager->getClassMetadata('Dummy')->willReturn($classMetadata->reveal());
195+
$managerRegistry = $this->prophesize(ManagerRegistry::class);
196+
$managerRegistry->getManagerForClass('Dummy')->willReturn($objectManager->reveal());
197+
198+
$this->assertTrue(QueryChecker::hasOrderByOnToManyJoin($queryBuilder->reveal(), $managerRegistry->reveal()));
199+
}
179200
}

tests/Bridge/Doctrine/Orm/Util/QueryJoinParserTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public function testGetClassMetadataFromJoinAlias()
3333
$queryBuilder = $this->prophesize(QueryBuilder::class);
3434
$queryBuilder->getRootEntities()->willReturn(['Dummy']);
3535
$queryBuilder->getRootAliases()->willReturn(['d']);
36-
$queryBuilder->getDQLPart('join')->willReturn(['a_1' => new Join('INNER_JOIN', 'relatedDummy', 'a_1', null, 'a_1.name = r.name')]);
36+
$queryBuilder->getDQLPart('join')->willReturn(['a_1' => [new Join('INNER_JOIN', 'relatedDummy', 'a_1', null, 'a_1.name = r.name')]]);
3737
$classMetadata = $this->prophesize(ClassMetadata::class);
3838
$objectManager = $this->prophesize(ObjectManager::class);
3939
$objectManager->getClassMetadata('Dummy')->willReturn($classMetadata->reveal());

0 commit comments

Comments
 (0)