Skip to content

Commit

Permalink
refactor(eager loading): Avoid joining unnecessary recursive relations
Browse files Browse the repository at this point in the history
  • Loading branch information
carlobeltrame committed Aug 9, 2021
1 parent 7063984 commit 8f1f2c9
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 10 deletions.
19 changes: 11 additions & 8 deletions features/doctrine/eager_loading.feature
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ Feature: Eager Loading
Then the response status code should be 200
And the DQL should be equal to:
"""
SELECT o, thirdLevel_a1, relatedToDummyFriend_a2, dummyFriend_a3
SELECT o, thirdLevel_a1, fourthLevel_a2, relatedToDummyFriend_a3, dummyFriend_a4
FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\RelatedDummy o
LEFT JOIN o.thirdLevel thirdLevel_a1
LEFT JOIN o.relatedToDummyFriend relatedToDummyFriend_a2
LEFT JOIN relatedToDummyFriend_a2.dummyFriend dummyFriend_a3
LEFT JOIN thirdLevel_a1.fourthLevel fourthLevel_a2
LEFT JOIN o.relatedToDummyFriend relatedToDummyFriend_a3
LEFT JOIN relatedToDummyFriend_a3.dummyFriend dummyFriend_a4
WHERE o.id = :id_id
"""

Expand Down Expand Up @@ -45,11 +46,12 @@ Feature: Eager Loading
Then the response status code should be 200
And the DQL should be equal to:
"""
SELECT o, thirdLevel_a4, relatedToDummyFriend_a1, dummyFriend_a5
SELECT o, thirdLevel_a4, fourthLevel_a5, relatedToDummyFriend_a1, dummyFriend_a6
FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\RelatedDummy o
INNER JOIN o.relatedToDummyFriend relatedToDummyFriend_a1
LEFT JOIN o.thirdLevel thirdLevel_a4
INNER JOIN relatedToDummyFriend_a1.dummyFriend dummyFriend_a5
LEFT JOIN thirdLevel_a4.fourthLevel fourthLevel_a5
INNER JOIN relatedToDummyFriend_a1.dummyFriend dummyFriend_a6
WHERE o IN(
SELECT o_a2
FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\RelatedDummy o_a2
Expand Down Expand Up @@ -81,11 +83,12 @@ Feature: Eager Loading
Then the response status code should be 200
And the DQL should be equal to:
"""
SELECT o, thirdLevel_a3, relatedToDummyFriend_a4, dummyFriend_a5
SELECT o, thirdLevel_a3, fourthLevel_a4, relatedToDummyFriend_a5, dummyFriend_a6
FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\RelatedDummy o
LEFT JOIN o.thirdLevel thirdLevel_a3
LEFT JOIN o.relatedToDummyFriend relatedToDummyFriend_a4
LEFT JOIN relatedToDummyFriend_a4.dummyFriend dummyFriend_a5
LEFT JOIN thirdLevel_a3.fourthLevel fourthLevel_a4
LEFT JOIN o.relatedToDummyFriend relatedToDummyFriend_a5
LEFT JOIN relatedToDummyFriend_a5.dummyFriend dummyFriend_a6
WHERE o.id IN (
SELECT related_dummy_a1.id
FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\RelatedDummy related_dummy_a1
Expand Down
8 changes: 6 additions & 2 deletions src/Bridge/Doctrine/Orm/Extension/EagerLoadingExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -189,8 +189,7 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt
continue;
}

$isNotReadableLink = false === $propertyMetadata->isReadableLink();
if (null === $fetchEager && (false === $propertyMetadata->isReadable() || ((null === $inAttributes && $isNotReadableLink) || (false === $inAttributes)))) {
if (true !== $fetchEager && (false === $propertyMetadata->isReadable() || false === $inAttributes)) {
continue;
}

Expand Down Expand Up @@ -234,6 +233,11 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt
continue;
}

// Only join the relation's relations recursively if it's a readableLink
if (true !== $fetchEager && (true !== $propertyMetadata->isReadableLink())) {
continue;
}

if (isset($attributesMetadata[$association])) {
$maxDepth = $attributesMetadata[$association]->getMaxDepth();

Expand Down

0 comments on commit 8f1f2c9

Please sign in to comment.