From 5047dff2bd40982e58fe5fef8aea8d270faa3541 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 20 Nov 2018 19:38:30 +0100 Subject: [PATCH] Add support for searching by multiple nested associations --- src/Search/QueryBuilder.php | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Search/QueryBuilder.php b/src/Search/QueryBuilder.php index be2fd2c0d1..e0a7852c35 100644 --- a/src/Search/QueryBuilder.php +++ b/src/Search/QueryBuilder.php @@ -104,14 +104,21 @@ public function createSearchQueryBuilder(array $entityConfig, $searchQuery, $sor foreach ($entityConfig['search']['fields'] as $fieldName => $metadata) { $entityName = 'entity'; if ($this->isDoctrineAssociation($classMetadata, $fieldName)) { - list($associatedEntityName, $associatedFieldName) = explode('.', $fieldName); - if (!in_array($associatedEntityName, $entitiesAlreadyJoined)) { - $queryBuilder->leftJoin('entity.'.$associatedEntityName, $associatedEntityName); - $entitiesAlreadyJoined[] = $associatedEntityName; + // support arbitrarily nested associations (e.g. foo.bar.baz.qux) + $associationComponents = explode('.', $fieldName); + for ($i = 0; $i < count($associationComponents) - 1; ++$i) { + $associatedEntityName = $associationComponents[$i]; + $associatedFieldName = $associationComponents[$i + 1]; + + if (!in_array($associatedEntityName, $entitiesAlreadyJoined)) { + $parentEntityName = 0 === $i ? 'entity' : $associationComponents[$i - 1]; + $queryBuilder->leftJoin($parentEntityName.'.'.$associatedEntityName, $associatedEntityName); + $entitiesAlreadyJoined[] = $associatedEntityName; + } + + $entityName = $associatedEntityName; + $fieldName = $associatedFieldName; } - - $entityName = $associatedEntityName; - $fieldName = $associatedFieldName; } $isSmallIntegerField = 'smallint' === $metadata['dataType'];