Skip to content

Commit 42ee57a

Browse files
committed
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
1 parent 5e2c374 commit 42ee57a

1 file changed

Lines changed: 8 additions & 4 deletions

File tree

src/Orm/EntityRepository.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ private function addSearchClause(QueryBuilder $queryBuilder, SearchDto $searchDt
8282
];
8383

8484
$entitiesAlreadyJoined = [];
85+
$entityAliases = [];
8586
$configuredSearchableProperties = $searchDto->getSearchableProperties();
8687
$searchableProperties = (null === $configuredSearchableProperties || 0 === \count($configuredSearchableProperties)) ? $entityDto->getAllPropertyNames() : $configuredSearchableProperties;
8788
foreach ($searchableProperties as $propertyName) {
@@ -101,13 +102,16 @@ private function addSearchClause(QueryBuilder $queryBuilder, SearchDto $searchDt
101102
$associatedEntityAlias = $associatedPropertyName = '';
102103
for ($i = 0; $i < $numAssociatedProperties - 1; ++$i) {
103104
$associatedEntityName = $associatedProperties[$i];
104-
$associatedEntityAlias = Escaper::escapeDqlAlias($associatedEntityName);
105+
$associatedEntityPath = implode('.', \array_slice($associatedProperties, 0, $i+1));
106+
$associatedEntityAlias = '__ea_alias_'.\count($entityAliases);
107+
$entityAliases[$associatedEntityPath] = $associatedEntityAlias;
105108
$associatedPropertyName = $associatedProperties[$i + 1];
106109

107-
if (!\in_array($associatedEntityName, $entitiesAlreadyJoined, true)) {
108-
$parentEntityName = 0 === $i ? 'entity' : $associatedProperties[$i - 1];
110+
if (!\in_array($associatedEntityPath, $entitiesAlreadyJoined, true)) {
111+
$associatedEntityParentPath = implode('.', \array_slice($associatedProperties, 0, $i));
112+
$parentEntityName = 0 === $i ? 'entity' : $entityAliases[$associatedEntityParentPath];
109113
$queryBuilder->leftJoin($parentEntityName.'.'.$associatedEntityName, $associatedEntityAlias);
110-
$entitiesAlreadyJoined[] = $associatedEntityName;
114+
$entitiesAlreadyJoined[] = $associatedEntityPath;
111115
}
112116

113117
if ($i < $numAssociatedProperties - 2) {

0 commit comments

Comments
 (0)