From 0ec9347345f71109e7c6df121ac77920b27bbce3 Mon Sep 17 00:00:00 2001 From: Frank Dekker Date: Sun, 13 Oct 2024 23:48:50 +0200 Subject: [PATCH] feat(doctrine): allow for comma-separated values in numeric-filter --- src/Doctrine/Common/Filter/NumericFilterTrait.php | 5 +++++ src/Doctrine/Orm/Tests/Filter/NumericFilterTest.php | 3 +++ .../Orm/Tests/Filter/NumericFilterTestTrait.php | 10 ++++++++++ 3 files changed, 18 insertions(+) diff --git a/src/Doctrine/Common/Filter/NumericFilterTrait.php b/src/Doctrine/Common/Filter/NumericFilterTrait.php index 242a627531d..135e3bfb4cc 100644 --- a/src/Doctrine/Common/Filter/NumericFilterTrait.php +++ b/src/Doctrine/Common/Filter/NumericFilterTrait.php @@ -81,6 +81,11 @@ protected function isNumericField(string $property, string $resourceClass): bool protected function normalizeValues($value, string $property): ?array { + // Allow CSV format for multiple values. + if (\is_string($value) && str_contains($value, ',')) { + $value = explode(',', $value); + } + if (!is_numeric($value) && (!\is_array($value) || !$this->isNumericArray($value))) { $this->getLogger()->notice('Invalid filter ignored', [ 'exception' => new InvalidArgumentException(\sprintf('Invalid numeric value for "%s" property', $property)), diff --git a/src/Doctrine/Orm/Tests/Filter/NumericFilterTest.php b/src/Doctrine/Orm/Tests/Filter/NumericFilterTest.php index 2ef8494f09f..d7f3f647a7c 100644 --- a/src/Doctrine/Orm/Tests/Filter/NumericFilterTest.php +++ b/src/Doctrine/Orm/Tests/Filter/NumericFilterTest.php @@ -78,6 +78,9 @@ public static function provideApplyTestData(): array 'numeric string (positive integer)' => [ \sprintf('SELECT o FROM %s o WHERE o.dummyPrice = :dummyPrice_p1', Dummy::class), ], + 'comma-separated numeric string (positive integer)' => [ + \sprintf('SELECT o FROM %s o WHERE o.dummyPrice IN (:dummyPrice_p1)', Dummy::class), + ], 'multiple numeric string (positive integer)' => [ \sprintf('SELECT o FROM %s o WHERE o.dummyPrice IN (:dummyPrice_p1)', Dummy::class), ], diff --git a/src/Doctrine/Orm/Tests/Filter/NumericFilterTestTrait.php b/src/Doctrine/Orm/Tests/Filter/NumericFilterTestTrait.php index 3941852784c..ac2572a251d 100644 --- a/src/Doctrine/Orm/Tests/Filter/NumericFilterTestTrait.php +++ b/src/Doctrine/Orm/Tests/Filter/NumericFilterTestTrait.php @@ -100,6 +100,16 @@ private static function provideApplyTestArguments(): array 'dummyPrice' => '21', ], ], + 'comma-separated numeric string (positive integer)' => [ + [ + 'id' => null, + 'name' => null, + 'dummyPrice' => null, + ], + [ + 'dummyPrice' => ['21,22'], + ], + ], 'multiple numeric string (positive integer)' => [ [ 'id' => null,