Skip to content

Commit

Permalink
Merge pull request #3520 from soyuka/revert-3331
Browse files Browse the repository at this point in the history
Revert "Passing custom doctrine type to addWhereByStrategy"
  • Loading branch information
soyuka committed Apr 24, 2020
2 parents 5a7c2e4 + a9e94fb commit 52b771c
Showing 1 changed file with 16 additions and 13 deletions.
29 changes: 16 additions & 13 deletions src/Bridge/Doctrine/Orm/Filter/SearchFilter.php
Expand Up @@ -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)),
]);
Expand All @@ -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;
}
Expand All @@ -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);
Expand Down Expand Up @@ -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);
}
}

Expand All @@ -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);
Expand All @@ -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));
Expand Down

0 comments on commit 52b771c

Please sign in to comment.