diff --git a/src/Bridge/Doctrine/Orm/Filter/SearchFilter.php b/src/Bridge/Doctrine/Orm/Filter/SearchFilter.php index 6b539999645..da0b8f3b505 100644 --- a/src/Bridge/Doctrine/Orm/Filter/SearchFilter.php +++ b/src/Bridge/Doctrine/Orm/Filter/SearchFilter.php @@ -92,11 +92,12 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB $caseSensitive = true; $metadata = $this->getNestedMetadata($resourceClass, $associations); - $doctrineTypeField = $this->getDoctrineFieldType($property, $resourceClass); - $values = array_map([$this, 'getIdFromValue'], $values); - if ($metadata->hasField($field)) { - if (!$this->hasValidValues($values, $doctrineTypeField)) { + if ('id' === $field) { + $values = array_map([$this, 'getIdFromValue'], $values); + } + + if (!$this->hasValidValues($values, $this->getDoctrineFieldType($property, $resourceClass))) { $this->logger->notice('Invalid filter ignored', [ 'exception' => new InvalidArgumentException(sprintf('Values for field "%s" are not valid according to the doctrine type.', $field)), ]); @@ -113,7 +114,7 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB } if (1 === \count($values)) { - $this->addWhereByStrategy($strategy, $queryBuilder, $queryNameGenerator, $alias, $field, $doctrineTypeField, $values[0], $caseSensitive); + $this->addWhereByStrategy($strategy, $queryBuilder, $queryNameGenerator, $alias, $field, $values[0], $caseSensitive); return; } @@ -139,7 +140,9 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB return; } + $values = array_map([$this, 'getIdFromValue'], $values); $associationFieldIdentifier = 'id'; + $doctrineTypeField = $this->getDoctrineFieldType($property, $resourceClass); if (null !== $this->identifiersExtractor) { $associationResourceClass = $metadata->getAssociationTargetClass($field); @@ -168,11 +171,11 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB if (1 === \count($values)) { $queryBuilder ->andWhere(sprintf('%s.%s = :%s', $associationAlias, $associationField, $valueParameter)) - ->setParameter($valueParameter, $values[0], $doctrineTypeField); + ->setParameter($valueParameter, $values[0]); } else { $queryBuilder ->andWhere(sprintf('%s.%s IN (:%s)', $associationAlias, $associationField, $valueParameter)) - ->setParameter($valueParameter, $values, $doctrineTypeField); + ->setParameter($valueParameter, $values); } } @@ -181,7 +184,7 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB * * @throws InvalidArgumentException If strategy does not exist */ - protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $alias, string $field, $fieldType, $value, bool $caseSensitive) + protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $alias, string $field, $value, bool $caseSensitive) { $wrapCase = $this->createWrapCase($caseSensitive); $valueParameter = $queryNameGenerator->generateParameterName($field); @@ -191,27 +194,27 @@ protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuild case self::STRATEGY_EXACT: $queryBuilder ->andWhere(sprintf($wrapCase('%s.%s').' = '.$wrapCase(':%s'), $alias, $field, $valueParameter)) - ->setParameter($valueParameter, $value, $fieldType); + ->setParameter($valueParameter, $value); break; case self::STRATEGY_PARTIAL: $queryBuilder ->andWhere(sprintf($wrapCase('%s.%s').' LIKE '.$wrapCase('CONCAT(\'%%\', :%s, \'%%\')'), $alias, $field, $valueParameter)) - ->setParameter($valueParameter, $value, $fieldType); + ->setParameter($valueParameter, $value); break; case self::STRATEGY_START: $queryBuilder ->andWhere(sprintf($wrapCase('%s.%s').' LIKE '.$wrapCase('CONCAT(:%s, \'%%\')'), $alias, $field, $valueParameter)) - ->setParameter($valueParameter, $value, $fieldType); + ->setParameter($valueParameter, $value); break; case self::STRATEGY_END: $queryBuilder ->andWhere(sprintf($wrapCase('%s.%s').' LIKE '.$wrapCase('CONCAT(\'%%\', :%s)'), $alias, $field, $valueParameter)) - ->setParameter($valueParameter, $value, $fieldType); + ->setParameter($valueParameter, $value); break; case self::STRATEGY_WORD_START: $queryBuilder ->andWhere(sprintf($wrapCase('%1$s.%2$s').' LIKE '.$wrapCase('CONCAT(:%3$s, \'%%\')').' OR '.$wrapCase('%1$s.%2$s').' LIKE '.$wrapCase('CONCAT(\'%% \', :%3$s, \'%%\')'), $alias, $field, $valueParameter)) - ->setParameter($valueParameter, $value, $fieldType); + ->setParameter($valueParameter, $value); break; default: throw new InvalidArgumentException(sprintf('strategy %s does not exist.', $strategy));