diff --git a/features/main/circular_reference.feature b/features/main/circular_reference.feature index 4cfac6bdb46..ce86453f6f7 100644 --- a/features/main/circular_reference.feature +++ b/features/main/circular_reference.feature @@ -61,10 +61,29 @@ Feature: Circular references handling "@type": "CircularReference", "parent": "/circular_references/1", "children": [ - "/circular_references/1", - "/circular_references/2" + "/circular_references/1" ] }, "children": [] } """ + And I send a "GET" request to "/circular_references/1" + Then the response status code should be 200 + And the JSON should be equal to: + """ + { + "@context": "/contexts/CircularReference", + "@id": "/circular_references/1", + "@type": "CircularReference", + "parent": "/circular_references/1", + "children": [ + "/circular_references/1", + { + "@id": "/circular_references/2", + "@type": "CircularReference", + "parent": "/circular_references/1", + "children": [] + } + ] + } + """ diff --git a/src/Bridge/Doctrine/Orm/Extension/EagerLoadingExtension.php b/src/Bridge/Doctrine/Orm/Extension/EagerLoadingExtension.php index 65a9651d440..970714e8ff5 100644 --- a/src/Bridge/Doctrine/Orm/Extension/EagerLoadingExtension.php +++ b/src/Bridge/Doctrine/Orm/Extension/EagerLoadingExtension.php @@ -200,9 +200,13 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt $queryBuilder->addSelect($associationAlias); } - // Avoid recursion + // Avoid recursive joins if ($mapping['targetEntity'] === $resourceClass) { - $queryBuilder->addSelect($associationAlias); + // Avoid joining the same association twice (see #1959) + if (!\in_array($associationAlias, $queryBuilder->getAllAliases(), true)) { + $queryBuilder->addSelect($associationAlias); + } + continue; }