diff --git a/src/Laravel/Eloquent/Filter/BooleanFilter.php b/src/Laravel/Eloquent/Filter/BooleanFilter.php index 9879c2212f6..0fd171bc696 100644 --- a/src/Laravel/Eloquent/Filter/BooleanFilter.php +++ b/src/Laravel/Eloquent/Filter/BooleanFilter.php @@ -39,7 +39,7 @@ public function apply(Builder $builder, mixed $values, Parameter $parameter, arr return $builder; } - return $builder->{$context['whereClause'] ?? 'where'}($this->getQueryProperty($parameter), $values); + return $builder->{$context['whereClause'] ?? 'where'}($this->getQueryProperty($parameter), self::BOOLEAN_VALUES[$values]); } public function getSchema(Parameter $parameter): array diff --git a/src/Laravel/Metadata/ParameterValidationResourceMetadataCollectionFactory.php b/src/Laravel/Metadata/ParameterValidationResourceMetadataCollectionFactory.php index e3741201582..11b2aba085d 100644 --- a/src/Laravel/Metadata/ParameterValidationResourceMetadataCollectionFactory.php +++ b/src/Laravel/Metadata/ParameterValidationResourceMetadataCollectionFactory.php @@ -22,6 +22,8 @@ final class ParameterValidationResourceMetadataCollectionFactory implements ResourceMetadataCollectionFactoryInterface { + private const BOOLEAN_VALUES = ['true', 'false', '1', '0']; + public function __construct( private readonly ?ResourceMetadataCollectionFactoryInterface $decorated = null, private readonly ?ContainerInterface $filterLocator = null, @@ -145,7 +147,7 @@ private function addSchemaValidation(Parameter $parameter): Parameter } if (isset($schema['type']) && 'boolean' === $schema['type']) { - $assertions[] = 'boolean'; + $assertions[] = Rule::in(self::BOOLEAN_VALUES); } if (!$assertions) { diff --git a/src/Laravel/Tests/EloquentTest.php b/src/Laravel/Tests/EloquentTest.php index b0b67ff98d2..1ffa428c8ff 100644 --- a/src/Laravel/Tests/EloquentTest.php +++ b/src/Laravel/Tests/EloquentTest.php @@ -433,10 +433,18 @@ public function testWithAccessor(): void public function testBooleanFilter(): void { - BookFactory::new()->has(AuthorFactory::new())->count(10)->create(); + $books = BookFactory::new()->has(AuthorFactory::new())->count(10)->create(); $res = $this->get('/api/books?published=notabool', ['Accept' => ['application/ld+json']]); $this->assertEquals($res->getStatusCode(), 422); + $res = $this->get('/api/books?published=true', ['Accept' => ['application/ld+json']]); + $res->assertOk(); + $this->assertSame($books->count(), $res->json()['totalItems']); + + $res = $this->get('/api/books?published=false', ['Accept' => ['application/ld+json']]); + $res->assertOk(); + $this->assertSame(0, $res->json()['totalItems']); + $res = $this->get('/api/books?published=0', ['Accept' => ['application/ld+json']]); $this->assertEquals($res->getStatusCode(), 200); $this->assertEquals($res->json()['totalItems'], 0);