From 6c06a52e746ddd31dd03b9f1b05b2f0eea6461c6 Mon Sep 17 00:00:00 2001 From: derpue Date: Sat, 11 Mar 2023 15:33:46 +0100 Subject: [PATCH] Fix addSearchClause for nested Entities * use the whole nested path to check for an already joined Entity * generate unique join aliases to prevent possible errors with duplicate aliases --- src/Orm/EntityRepository.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Orm/EntityRepository.php b/src/Orm/EntityRepository.php index 3c724068e2..de0a3b4155 100644 --- a/src/Orm/EntityRepository.php +++ b/src/Orm/EntityRepository.php @@ -82,6 +82,7 @@ private function addSearchClause(QueryBuilder $queryBuilder, SearchDto $searchDt ]; $entitiesAlreadyJoined = []; + $entityAliases = []; $configuredSearchableProperties = $searchDto->getSearchableProperties(); $searchableProperties = (null === $configuredSearchableProperties || 0 === \count($configuredSearchableProperties)) ? $entityDto->getAllPropertyNames() : $configuredSearchableProperties; foreach ($searchableProperties as $propertyName) { @@ -101,13 +102,16 @@ private function addSearchClause(QueryBuilder $queryBuilder, SearchDto $searchDt $associatedEntityAlias = $associatedPropertyName = ''; for ($i = 0; $i < $numAssociatedProperties - 1; ++$i) { $associatedEntityName = $associatedProperties[$i]; - $associatedEntityAlias = Escaper::escapeDqlAlias($associatedEntityName); + $associatedEntityPath = implode('.', \array_slice($associatedProperties, 0, $i + 1)); + $associatedEntityAlias = '__ea_alias_'.\count($entityAliases); + $entityAliases[$associatedEntityPath] = $associatedEntityAlias; $associatedPropertyName = $associatedProperties[$i + 1]; - if (!\in_array($associatedEntityName, $entitiesAlreadyJoined, true)) { - $parentEntityName = 0 === $i ? 'entity' : $associatedProperties[$i - 1]; + if (!\in_array($associatedEntityPath, $entitiesAlreadyJoined, true)) { + $associatedEntityParentPath = implode('.', \array_slice($associatedProperties, 0, $i)); + $parentEntityName = 0 === $i ? 'entity' : $entityAliases[$associatedEntityParentPath]; $queryBuilder->leftJoin($parentEntityName.'.'.$associatedEntityName, $associatedEntityAlias); - $entitiesAlreadyJoined[] = $associatedEntityName; + $entitiesAlreadyJoined[] = $associatedEntityPath; } if ($i < $numAssociatedProperties - 2) {