Skip to content

Commit 9802f4d

Browse files
carlobeltramealanpoulain
authored andcommitted
refactor(eager loading): Avoid joining unnecessary recursive relations
1 parent 100388d commit 9802f4d

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

features/doctrine/eager_loading.feature

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ Feature: Eager Loading
1111
Then the response status code should be 200
1212
And the DQL should be equal to:
1313
"""
14-
SELECT o, thirdLevel_a1, relatedToDummyFriend_a2, dummyFriend_a3
14+
SELECT o, thirdLevel_a1, fourthLevel_a2, relatedToDummyFriend_a3, dummyFriend_a4
1515
FROM ApiPlatform\Tests\Fixtures\TestBundle\Entity\RelatedDummy o
1616
LEFT JOIN o.thirdLevel thirdLevel_a1
17-
LEFT JOIN o.relatedToDummyFriend relatedToDummyFriend_a2
18-
LEFT JOIN relatedToDummyFriend_a2.dummyFriend dummyFriend_a3
17+
LEFT JOIN thirdLevel_a1.fourthLevel fourthLevel_a2
18+
LEFT JOIN o.relatedToDummyFriend relatedToDummyFriend_a3
19+
LEFT JOIN relatedToDummyFriend_a3.dummyFriend dummyFriend_a4
1920
WHERE o.id = :id_id
2021
"""
2122

@@ -45,11 +46,12 @@ Feature: Eager Loading
4546
Then the response status code should be 200
4647
And the DQL should be equal to:
4748
"""
48-
SELECT o, thirdLevel_a4, relatedToDummyFriend_a1, dummyFriend_a5
49+
SELECT o, thirdLevel_a4, fourthLevel_a5, relatedToDummyFriend_a1, dummyFriend_a6
4950
FROM ApiPlatform\Tests\Fixtures\TestBundle\Entity\RelatedDummy o
5051
INNER JOIN o.relatedToDummyFriend relatedToDummyFriend_a1
5152
LEFT JOIN o.thirdLevel thirdLevel_a4
52-
INNER JOIN relatedToDummyFriend_a1.dummyFriend dummyFriend_a5
53+
LEFT JOIN thirdLevel_a4.fourthLevel fourthLevel_a5
54+
INNER JOIN relatedToDummyFriend_a1.dummyFriend dummyFriend_a6
5355
WHERE o IN(
5456
SELECT o_a2
5557
FROM ApiPlatform\Tests\Fixtures\TestBundle\Entity\RelatedDummy o_a2
@@ -81,11 +83,12 @@ Feature: Eager Loading
8183
Then the response status code should be 200
8284
And the DQL should be equal to:
8385
"""
84-
SELECT o, thirdLevel_a3, relatedToDummyFriend_a4, dummyFriend_a5
86+
SELECT o, thirdLevel_a3, fourthLevel_a4, relatedToDummyFriend_a5, dummyFriend_a6
8587
FROM ApiPlatform\Tests\Fixtures\TestBundle\Entity\RelatedDummy o
8688
LEFT JOIN o.thirdLevel thirdLevel_a3
87-
LEFT JOIN o.relatedToDummyFriend relatedToDummyFriend_a4
88-
LEFT JOIN relatedToDummyFriend_a4.dummyFriend dummyFriend_a5
89+
LEFT JOIN thirdLevel_a3.fourthLevel fourthLevel_a4
90+
LEFT JOIN o.relatedToDummyFriend relatedToDummyFriend_a5
91+
LEFT JOIN relatedToDummyFriend_a5.dummyFriend dummyFriend_a6
8992
WHERE o.id IN (
9093
SELECT related_dummy_a1.id
9194
FROM ApiPlatform\Tests\Fixtures\TestBundle\Entity\RelatedDummy related_dummy_a1

src/Core/Bridge/Doctrine/Orm/Extension/EagerLoadingExtension.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,7 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt
228228
continue;
229229
}
230230

231-
$isNotReadableLink = false === $propertyMetadata->isReadableLink();
232-
if (null === $fetchEager && (false === $propertyMetadata->isReadable() || ((null === $inAttributes && $isNotReadableLink) || (false === $inAttributes)))) {
231+
if (true !== $fetchEager && (false === $propertyMetadata->isReadable() || false === $inAttributes)) {
233232
continue;
234233
}
235234

@@ -273,6 +272,11 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt
273272
continue;
274273
}
275274

275+
// Only join the relation's relations recursively if it's a readableLink
276+
if (true !== $fetchEager && (true !== $propertyMetadata->isReadableLink())) {
277+
continue;
278+
}
279+
276280
if (isset($attributesMetadata[$association])) {
277281
$maxDepth = $attributesMetadata[$association]->getMaxDepth();
278282

0 commit comments

Comments
 (0)