Skip to content

Commit 60082d7

Browse files
fix(doctrine): use fromClass metadata for each link (#5508)
When provided with both a fromProperty and toProperty in a link, the wrong class metadata was used to find the type of the identifier parameters (line 123). $doctrineClassMetadata was used for both the resource class and the fromClass which was confusing, I renamed the latter to fromClassMetadata in order to clarify things up.
1 parent 62510b2 commit 60082d7

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

src/Doctrine/Orm/State/LinksHandlerTrait.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,30 +49,29 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que
4949
continue;
5050
}
5151

52+
$fromClassMetadata = $manager->getClassMetadata($link->getFromClass());
5253
$identifierProperties = $link->getIdentifiers();
5354
$hasCompositeIdentifiers = 1 < \count($identifierProperties);
5455

5556
if (!$link->getFromProperty() && !$link->getToProperty()) {
56-
$doctrineClassMetadata = $manager->getClassMetadata($link->getFromClass());
5757
$currentAlias = $link->getFromClass() === $entityClass ? $alias : $queryNameGenerator->generateJoinAlias($alias);
5858

5959
foreach ($identifierProperties as $identifierProperty) {
6060
$placeholder = $queryNameGenerator->generateParameterName($identifierProperty);
6161
$queryBuilder->andWhere("$currentAlias.$identifierProperty = :$placeholder");
62-
$queryBuilder->setParameter($placeholder, $this->getIdentifierValue($identifiers, $hasCompositeIdentifiers ? $identifierProperty : null), $doctrineClassMetadata->getTypeOfField($identifierProperty));
62+
$queryBuilder->setParameter($placeholder, $this->getIdentifierValue($identifiers, $hasCompositeIdentifiers ? $identifierProperty : null), $fromClassMetadata->getTypeOfField($identifierProperty));
6363
}
6464

6565
$previousAlias = $currentAlias;
66-
$previousJoinProperties = $doctrineClassMetadata->getIdentifierFieldNames();
66+
$previousJoinProperties = $fromClassMetadata->getIdentifierFieldNames();
6767
continue;
6868
}
6969

7070
$joinProperties = $doctrineClassMetadata->getIdentifierFieldNames();
7171

7272
if ($link->getFromProperty() && !$link->getToProperty()) {
73-
$doctrineClassMetadata = $manager->getClassMetadata($link->getFromClass());
7473
$joinAlias = $queryNameGenerator->generateJoinAlias('m');
75-
$associationMapping = $doctrineClassMetadata->getAssociationMapping($link->getFromProperty()); // @phpstan-ignore-line
74+
$associationMapping = $fromClassMetadata->getAssociationMapping($link->getFromProperty()); // @phpstan-ignore-line
7675
$relationType = $associationMapping['type'];
7776

7877
if ($relationType & ClassMetadataInfo::TO_MANY) {
@@ -81,7 +80,7 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que
8180
foreach ($identifierProperties as $identifierProperty) {
8281
$placeholder = $queryNameGenerator->generateParameterName($identifierProperty);
8382
$whereClause[] = "$nextAlias.{$identifierProperty} = :$placeholder";
84-
$queryBuilder->setParameter($placeholder, $this->getIdentifierValue($identifiers, $hasCompositeIdentifiers ? $identifierProperty : null), $doctrineClassMetadata->getTypeOfField($identifierProperty));
83+
$queryBuilder->setParameter($placeholder, $this->getIdentifierValue($identifiers, $hasCompositeIdentifiers ? $identifierProperty : null), $fromClassMetadata->getTypeOfField($identifierProperty));
8584
}
8685

8786
$property = $associationMapping['mappedBy'] ?? $joinProperties[0];
@@ -106,7 +105,7 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que
106105
foreach ($identifierProperties as $identifierProperty) {
107106
$placeholder = $queryNameGenerator->generateParameterName($identifierProperty);
108107
$queryBuilder->andWhere("$joinAlias.$identifierProperty = :$placeholder");
109-
$queryBuilder->setParameter($placeholder, $this->getIdentifierValue($identifiers, $hasCompositeIdentifiers ? $identifierProperty : null), $doctrineClassMetadata->getTypeOfField($identifierProperty));
108+
$queryBuilder->setParameter($placeholder, $this->getIdentifierValue($identifiers, $hasCompositeIdentifiers ? $identifierProperty : null), $fromClassMetadata->getTypeOfField($identifierProperty));
110109
}
111110

112111
$previousAlias = $joinAlias;
@@ -120,7 +119,7 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que
120119
foreach ($identifierProperties as $identifierProperty) {
121120
$placeholder = $queryNameGenerator->generateParameterName($identifierProperty);
122121
$queryBuilder->andWhere("$joinAlias.$identifierProperty = :$placeholder");
123-
$queryBuilder->setParameter($placeholder, $this->getIdentifierValue($identifiers, $hasCompositeIdentifiers ? $identifierProperty : null), $doctrineClassMetadata->getTypeOfField($identifierProperty));
122+
$queryBuilder->setParameter($placeholder, $this->getIdentifierValue($identifiers, $hasCompositeIdentifiers ? $identifierProperty : null), $fromClassMetadata->getTypeOfField($identifierProperty));
124123
}
125124

126125
$previousAlias = $joinAlias;

0 commit comments

Comments
 (0)