Skip to content

Commit 08772cf

Browse files
authored
[11.x] Accept non-backed enum in database queries (#50674)
* Cast non-backed enum in database bindings * Update enum queries integration tests
1 parent 075bda5 commit 08772cf

File tree

5 files changed

+37
-1
lines changed

5 files changed

+37
-1
lines changed

src/Illuminate/Database/Query/Builder.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use InvalidArgumentException;
2828
use LogicException;
2929
use RuntimeException;
30+
use UnitEnum;
3031

3132
class Builder implements BuilderContract
3233
{
@@ -3953,7 +3954,11 @@ public function addBinding($value, $type = 'where')
39533954
*/
39543955
public function castBinding($value)
39553956
{
3956-
return $value instanceof BackedEnum ? $value->value : $value;
3957+
if ($value instanceof UnitEnum) {
3958+
return $value instanceof BackedEnum ? $value->value : $value->name;
3959+
}
3960+
3961+
return $value;
39573962
}
39583963

39593964
/**

tests/Database/DatabaseQueryBuilderTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
use RuntimeException;
3131
use stdClass;
3232

33+
include_once 'Enums.php';
34+
3335
class DatabaseQueryBuilderTest extends TestCase
3436
{
3537
protected $called;
@@ -4474,6 +4476,14 @@ public function testAddBindingWithArrayMergesBindingsInCorrectOrder()
44744476
$this->assertEquals(['foo', 'bar', 'baz'], $builder->getBindings());
44754477
}
44764478

4479+
public function testAddBindingWithEnum()
4480+
{
4481+
$builder = $this->getBuilder();
4482+
$builder->addBinding(IntegerStatus::done);
4483+
$builder->addBinding([NonBackedStatus::done]);
4484+
$this->assertEquals([2, 'done'], $builder->getBindings());
4485+
}
4486+
44774487
public function testMergeBuilders()
44784488
{
44794489
$builder = $this->getBuilder();

tests/Database/Enums.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ enum IntegerStatus: int
1818
case done = 2;
1919
}
2020

21+
enum NonBackedStatus
22+
{
23+
case draft;
24+
case pending;
25+
case done;
26+
}
27+
2128
enum ArrayableStatus: string implements Arrayable
2229
{
2330
case pending = 'pending';

tests/Integration/Database/Enums.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ enum IntegerStatus: int
1818
case done = 2;
1919
}
2020

21+
enum NonBackedStatus
22+
{
23+
case draft;
24+
case pending;
25+
case done;
26+
}
27+
2128
enum ArrayableStatus: string implements Arrayable
2229
{
2330
case pending = 'pending';

tests/Integration/Database/QueryingWithEnumsTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ protected function afterRefreshingDatabase()
1616
$table->increments('id');
1717
$table->string('string_status', 100)->nullable();
1818
$table->integer('integer_status')->nullable();
19+
$table->string('non_backed_status', 100)->nullable();
1920
});
2021
}
2122

@@ -24,30 +25,36 @@ public function testCanQueryWithEnums()
2425
DB::table('enum_casts')->insert([
2526
'string_status' => 'pending',
2627
'integer_status' => 1,
28+
'non_backed_status' => 'pending',
2729
]);
2830

2931
$record = DB::table('enum_casts')->where('string_status', StringStatus::pending)->first();
3032
$record2 = DB::table('enum_casts')->where('integer_status', IntegerStatus::pending)->first();
3133
$record3 = DB::table('enum_casts')->whereIn('integer_status', [IntegerStatus::pending])->first();
34+
$record4 = DB::table('enum_casts')->where('non_backed_status', NonBackedStatus::pending)->first();
3235

3336
$this->assertNotNull($record);
3437
$this->assertNotNull($record2);
3538
$this->assertNotNull($record3);
39+
$this->assertNotNull($record4);
3640
$this->assertSame('pending', $record->string_status);
3741
$this->assertEquals(1, $record2->integer_status);
42+
$this->assertSame('pending', $record4->non_backed_status);
3843
}
3944

4045
public function testCanInsertWithEnums()
4146
{
4247
DB::table('enum_casts')->insert([
4348
'string_status' => StringStatus::pending,
4449
'integer_status' => IntegerStatus::pending,
50+
'non_backed_status' => NonBackedStatus::pending,
4551
]);
4652

4753
$record = DB::table('enum_casts')->where('string_status', StringStatus::pending)->first();
4854

4955
$this->assertNotNull($record);
5056
$this->assertSame('pending', $record->string_status);
5157
$this->assertEquals(1, $record->integer_status);
58+
$this->assertSame('pending', $record->non_backed_status);
5259
}
5360
}

0 commit comments

Comments
 (0)