From 0a11e3a02eff74c2c8141dc1c90091052a5e1077 Mon Sep 17 00:00:00 2001 From: Ben Younes <2910651+ousamabenyounes@users.noreply.github.com> Date: Tue, 8 Sep 2026 19:46:10 +0000 Subject: [PATCH] fix(doctrine): keep zero-backed enum filter values --- src/Doctrine/Orm/Filter/BackedEnumFilter.php | 2 +- .../Orm/Tests/Filter/BackedEnumFilterTest.php | 19 +++++++++++++ .../Fixtures/Entity/IntegerBackedEnum.php | 20 +++++++++++++ .../Entity/IntegerBackedEnumDummy.php | 28 +++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/Doctrine/Orm/Tests/Fixtures/Entity/IntegerBackedEnum.php create mode 100644 src/Doctrine/Orm/Tests/Fixtures/Entity/IntegerBackedEnumDummy.php diff --git a/src/Doctrine/Orm/Filter/BackedEnumFilter.php b/src/Doctrine/Orm/Filter/BackedEnumFilter.php index ab39bd0d405..d31edc9a735 100644 --- a/src/Doctrine/Orm/Filter/BackedEnumFilter.php +++ b/src/Doctrine/Orm/Filter/BackedEnumFilter.php @@ -130,7 +130,7 @@ protected function filterProperty(string $property, mixed $value, QueryBuilder $ $normalizedValues = array_filter(array_map( fn ($v) => $this->normalizeValue($v, $property), $values - )); + ), static fn ($value) => null !== $value); if (empty($normalizedValues)) { return; diff --git a/src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTest.php b/src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTest.php index 5f782daa457..ad583cc20c4 100644 --- a/src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTest.php +++ b/src/Doctrine/Orm/Tests/Filter/BackedEnumFilterTest.php @@ -16,6 +16,8 @@ use ApiPlatform\Doctrine\Orm\Filter\BackedEnumFilter; use ApiPlatform\Doctrine\Orm\Tests\DoctrineOrmFilterTestCase; use ApiPlatform\Doctrine\Orm\Tests\Fixtures\Entity\Dummy; +use ApiPlatform\Doctrine\Orm\Tests\Fixtures\Entity\IntegerBackedEnumDummy; +use PHPUnit\Framework\Attributes\DataProvider; /** * @author Rémi Marseille @@ -26,6 +28,23 @@ final class BackedEnumFilterTest extends DoctrineOrmFilterTestCase protected string $filterClass = BackedEnumFilter::class; + #[DataProvider('provideNonPositiveIntegerValues')] + public function testApplyNonPositiveIntegerValue(string $value): void + { + $this->doTestApply( + ['value' => null], + ['value' => $value], + \sprintf('SELECT o FROM %s o WHERE o.value = :value_p1', IntegerBackedEnumDummy::class), + resourceClass: IntegerBackedEnumDummy::class, + ); + } + + public static function provideNonPositiveIntegerValues(): iterable + { + yield 'zero' => ['0']; + yield 'negative' => ['-1']; + } + public static function provideApplyTestData(): array { return array_merge_recursive( diff --git a/src/Doctrine/Orm/Tests/Fixtures/Entity/IntegerBackedEnum.php b/src/Doctrine/Orm/Tests/Fixtures/Entity/IntegerBackedEnum.php new file mode 100644 index 00000000000..8d461c8deb9 --- /dev/null +++ b/src/Doctrine/Orm/Tests/Fixtures/Entity/IntegerBackedEnum.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Doctrine\Orm\Tests\Fixtures\Entity; + +enum IntegerBackedEnum: int +{ + case Negative = -1; + case Zero = 0; +} diff --git a/src/Doctrine/Orm/Tests/Fixtures/Entity/IntegerBackedEnumDummy.php b/src/Doctrine/Orm/Tests/Fixtures/Entity/IntegerBackedEnumDummy.php new file mode 100644 index 00000000000..c98c0c4e4b9 --- /dev/null +++ b/src/Doctrine/Orm/Tests/Fixtures/Entity/IntegerBackedEnumDummy.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Doctrine\Orm\Tests\Fixtures\Entity; + +use Doctrine\ORM\Mapping as ORM; + +#[ORM\Entity] +class IntegerBackedEnumDummy +{ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column] + public ?int $id = null; + + #[ORM\Column(enumType: IntegerBackedEnum::class)] + public IntegerBackedEnum $value; +}