diff --git a/src/Doctrine/Orm/Extension/EagerLoadingExtension.php b/src/Doctrine/Orm/Extension/EagerLoadingExtension.php index 240c1ff15d..7703c09075 100644 --- a/src/Doctrine/Orm/Extension/EagerLoadingExtension.php +++ b/src/Doctrine/Orm/Extension/EagerLoadingExtension.php @@ -113,8 +113,7 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt } $currentDepth = $currentDepth > 0 ? $currentDepth - 1 : $currentDepth; - $entityManager = $queryBuilder->getEntityManager(); - $classMetadata = $entityManager->getClassMetadata($resourceClass); + $classMetadata = $queryBuilder->getEntityManager()->getClassMetadata($resourceClass); $attributesMetadata = $this->classMetadataFactory?->getMetadataFor($resourceClass)->getAttributesMetadata(); foreach ($classMetadata->associationMappings as $association => $mapping) { @@ -123,6 +122,23 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt continue; } + // prepare the child context + $childNormalizationContext = $normalizationContext; + if (isset($normalizationContext[AbstractNormalizer::ATTRIBUTES])) { + if ($inAttributes = isset($normalizationContext[AbstractNormalizer::ATTRIBUTES][$association])) { + $childNormalizationContext[AbstractNormalizer::ATTRIBUTES] = $normalizationContext[AbstractNormalizer::ATTRIBUTES][$association]; + } + } else { + $inAttributes = null; + } + + if (true !== $inAttributes + && isset($attributesMetadata[$association]) + && empty(array_intersect($normalizationContext[AbstractNormalizer::GROUPS] ?? [], $attributesMetadata[$association]->getGroups()))) { + // Skip this association if the current normalization groups do not include the association's groups + continue; + } + try { $propertyMetadata = $this->propertyMetadataFactory->create($resourceClass, $association, $options); } catch (PropertyNotFoundException) { @@ -143,16 +159,6 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt continue; } - // prepare the child context - $childNormalizationContext = $normalizationContext; - if (isset($normalizationContext[AbstractNormalizer::ATTRIBUTES])) { - if ($inAttributes = isset($normalizationContext[AbstractNormalizer::ATTRIBUTES][$association])) { - $childNormalizationContext[AbstractNormalizer::ATTRIBUTES] = $normalizationContext[AbstractNormalizer::ATTRIBUTES][$association]; - } - } else { - $inAttributes = null; - } - $fetchEager = $propertyMetadata->getFetchEager(); $uriTemplate = $propertyMetadata->getUriTemplate(); diff --git a/src/Doctrine/Orm/Tests/Extension/EagerLoadingExtensionTest.php b/src/Doctrine/Orm/Tests/Extension/EagerLoadingExtensionTest.php index 2ad7a74d33..74372c3ca1 100644 --- a/src/Doctrine/Orm/Tests/Extension/EagerLoadingExtensionTest.php +++ b/src/Doctrine/Orm/Tests/Extension/EagerLoadingExtensionTest.php @@ -427,9 +427,11 @@ public function testMaxDepth(): void $dummyAttributeMetadata = new AttributeMetadata('dummy'); $dummyAttributeMetadata->setMaxDepth(2); + $dummyAttributeMetadata->addGroup('foo'); $relatedAttributeMetadata = new AttributeMetadata('relatedDummy'); $relatedAttributeMetadata->setMaxDepth(4); + $relatedAttributeMetadata->addGroup('foo'); $dummyClassMetadataInterfaceProphecy->getAttributesMetadata()->willReturn(['relatedDummy' => $dummyAttributeMetadata]); $relatedClassMetadataInterfaceProphecy->getAttributesMetadata()->willReturn(['dummy' => $relatedAttributeMetadata]);