Skip to content

Commit

Permalink
fix(doctrine): use fromClass metadata for each link (#5508)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
VincentChalnot committed Apr 21, 2023
1 parent 62510b2 commit 60082d7
Showing 1 changed file with 7 additions and 8 deletions.
15 changes: 7 additions & 8 deletions src/Doctrine/Orm/State/LinksHandlerTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,30 +49,29 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que
continue;
}

$fromClassMetadata = $manager->getClassMetadata($link->getFromClass());
$identifierProperties = $link->getIdentifiers();
$hasCompositeIdentifiers = 1 < \count($identifierProperties);

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

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

$previousAlias = $currentAlias;
$previousJoinProperties = $doctrineClassMetadata->getIdentifierFieldNames();
$previousJoinProperties = $fromClassMetadata->getIdentifierFieldNames();
continue;
}

$joinProperties = $doctrineClassMetadata->getIdentifierFieldNames();

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

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

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

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

$previousAlias = $joinAlias;
Expand Down

0 comments on commit 60082d7

Please sign in to comment.