Skip to content

Commit f6be0c8

Browse files
committed
SqlTranslator: convert BackedEnum to scalar (thanks @milo)
1 parent c2639e3 commit f6be0c8

2 files changed

Lines changed: 47 additions & 0 deletions

File tree

src/Database/SqlPreprocessor.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ private function formatValue($value, string $mode = null): string
189189
} elseif ($value instanceof \DateInterval) {
190190
return $this->driver->formatDateInterval($value);
191191

192+
} elseif ($value instanceof \BackedEnum && is_scalar($value->value)) {
193+
$this->remaining[] = $value->value;
194+
return '?';
195+
192196
} elseif ($value instanceof \Stringable) {
193197
$this->remaining[] = (string) $value;
194198
return '?';
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
/**
4+
* @phpVersion 8.1
5+
* @dataProvider? databases.ini
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
use Tester\Assert;
11+
12+
require __DIR__ . '/connect.inc.php'; // create $connection
13+
14+
15+
enum EnumInt: int
16+
{
17+
case One = 1;
18+
}
19+
20+
enum EnumString: string
21+
{
22+
case One = 'one';
23+
}
24+
25+
enum PureEnum
26+
{
27+
case One;
28+
}
29+
30+
31+
$preprocessor = new Nette\Database\SqlPreprocessor($connection);
32+
33+
[$sql, $params] = $preprocessor->process(['SELECT ?', EnumInt::One]);
34+
Assert::same('SELECT ?', $sql);
35+
Assert::same([1], $params);
36+
37+
[$sql, $params] = $preprocessor->process(['SELECT ?', EnumString::One]);
38+
Assert::same('SELECT ?', $sql);
39+
Assert::same(['one'], $params);
40+
41+
Assert::exception(function () use ($preprocessor) {
42+
$preprocessor->process(['SELECT ?', PureEnum::One]);
43+
}, Nette\InvalidArgumentException::class, 'Unexpected type of parameter: PureEnum');

0 commit comments

Comments
 (0)