Skip to content

Commit 07afa77

Browse files
authored
fix: check fetch joined queries based on all aliases (api-platform#4974)
fixes api-platform#4936
1 parent 603551a commit 07afa77

File tree

3 files changed

+8
-36
lines changed

3 files changed

+8
-36
lines changed

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

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ public static function hasMaxResults(QueryBuilder $queryBuilder): bool
9393
public static function hasOrderByOnFetchJoinedToManyAssociation(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry): bool
9494
{
9595
if (
96-
0 === \count($selectParts = $queryBuilder->getDQLPart('select')) ||
9796
0 === \count($queryBuilder->getDQLPart('join')) ||
9897
0 === \count($orderByParts = $queryBuilder->getDQLPart('orderBy'))
9998
) {
@@ -102,21 +101,6 @@ public static function hasOrderByOnFetchJoinedToManyAssociation(QueryBuilder $qu
102101

103102
$rootAliases = $queryBuilder->getRootAliases();
104103

105-
$selectAliases = [];
106-
107-
foreach ($selectParts as $select) {
108-
foreach ($select->getParts() as $part) {
109-
[$alias] = explode('.', $part);
110-
111-
$selectAliases[] = $alias;
112-
}
113-
}
114-
115-
$selectAliases = array_diff($selectAliases, $rootAliases);
116-
if (0 === \count($selectAliases)) {
117-
return false;
118-
}
119-
120104
$orderByAliases = [];
121105

122106
foreach ($orderByParts as $orderBy) {
@@ -134,11 +118,13 @@ public static function hasOrderByOnFetchJoinedToManyAssociation(QueryBuilder $qu
134118
return false;
135119
}
136120

121+
$allAliases = $queryBuilder->getAllAliases();
122+
137123
foreach ($orderByAliases as $orderByAlias) {
138124
$inToManyContext = false;
139125

140126
foreach (QueryBuilderHelper::traverseJoins($orderByAlias, $queryBuilder, $managerRegistry) as $alias => [$metadata, $association]) {
141-
if ($inToManyContext && \in_array($alias, $selectAliases, true)) {
127+
if ($inToManyContext && \in_array($alias, $allAliases, true)) {
142128
return true;
143129
}
144130

src/Doctrine/Orm/Util/QueryChecker.php

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ public static function hasMaxResults(QueryBuilder $queryBuilder): bool
9292
public static function hasOrderByOnFetchJoinedToManyAssociation(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry): bool
9393
{
9494
if (
95-
0 === \count($selectParts = $queryBuilder->getDQLPart('select')) ||
9695
0 === \count($queryBuilder->getDQLPart('join')) ||
9796
0 === \count($orderByParts = $queryBuilder->getDQLPart('orderBy'))
9897
) {
@@ -101,21 +100,6 @@ public static function hasOrderByOnFetchJoinedToManyAssociation(QueryBuilder $qu
101100

102101
$rootAliases = $queryBuilder->getRootAliases();
103102

104-
$selectAliases = [];
105-
106-
foreach ($selectParts as $select) {
107-
foreach ($select->getParts() as $part) {
108-
[$alias] = explode('.', $part);
109-
110-
$selectAliases[] = $alias;
111-
}
112-
}
113-
114-
$selectAliases = array_diff($selectAliases, $rootAliases);
115-
if (0 === \count($selectAliases)) {
116-
return false;
117-
}
118-
119103
$orderByAliases = [];
120104

121105
foreach ($orderByParts as $orderBy) {
@@ -133,11 +117,13 @@ public static function hasOrderByOnFetchJoinedToManyAssociation(QueryBuilder $qu
133117
return false;
134118
}
135119

120+
$allAliases = $queryBuilder->getAllAliases();
121+
136122
foreach ($orderByAliases as $orderByAlias) {
137123
$inToManyContext = false;
138124

139125
foreach (QueryBuilderHelper::traverseJoins($orderByAlias, $queryBuilder, $managerRegistry) as $alias => [$metadata, $association]) {
140-
if ($inToManyContext && \in_array($alias, $selectAliases, true)) {
126+
if ($inToManyContext && \in_array($alias, $allAliases, true)) {
141127
return true;
142128
}
143129

tests/Doctrine/Orm/Util/QueryCheckerTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ public function testHasOrderByOnFetchJoinedToManyAssociationNotFetchJoined()
175175
$managerRegistryProphecy->getManagerForClass(Dummy::class)->willReturn($entityManagerProphecy);
176176
$managerRegistryProphecy->getManagerForClass(RelatedDummy::class)->willReturn($entityManagerProphecy);
177177

178-
$this->assertFalse(QueryChecker::hasOrderByOnFetchJoinedToManyAssociation($queryBuilder, $managerRegistryProphecy->reveal()));
178+
$this->assertTrue(QueryChecker::hasOrderByOnFetchJoinedToManyAssociation($queryBuilder, $managerRegistryProphecy->reveal()));
179179
}
180180

181181
public function testHasOrderByOnFetchJoinedToManyAssociationWithJoinByAssociation()
@@ -277,7 +277,7 @@ public function testHasOrderByOnToManyJoinNotFetchJoined()
277277
$managerRegistryProphecy->getManagerForClass(Dummy::class)->willReturn($entityManagerProphecy);
278278
$managerRegistryProphecy->getManagerForClass(RelatedDummy::class)->willReturn($entityManagerProphecy);
279279

280-
$this->assertFalse(LegacyQueryChecker::hasOrderByOnToManyJoin($queryBuilder, $managerRegistryProphecy->reveal()));
280+
$this->assertTrue(LegacyQueryChecker::hasOrderByOnToManyJoin($queryBuilder, $managerRegistryProphecy->reveal()));
281281
}
282282

283283
/**

0 commit comments

Comments
 (0)