From 1db19c4786539879f0314698b9affd513dfc51da Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Tue, 25 Nov 2025 18:35:08 +0300 Subject: [PATCH 1/3] start --- src/Column/ColumnDefinitionBuilder.php | 27 +++++++++++++ tests/Column/EnumColumnTest.php | 56 ++++++++++++++++++++++++++ tests/Provider/SchemaProvider.php | 5 ++- 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 tests/Column/EnumColumnTest.php diff --git a/src/Column/ColumnDefinitionBuilder.php b/src/Column/ColumnDefinitionBuilder.php index 44e0c59a..8879771d 100644 --- a/src/Column/ColumnDefinitionBuilder.php +++ b/src/Column/ColumnDefinitionBuilder.php @@ -7,6 +7,7 @@ use Yiisoft\Db\Constant\ColumnType; use Yiisoft\Db\QueryBuilder\AbstractColumnDefinitionBuilder; use Yiisoft\Db\Schema\Column\ColumnInterface; +use Yiisoft\Db\Schema\Column\EnumColumn; use function str_contains; use function version_compare; @@ -63,6 +64,17 @@ final class ColumnDefinitionBuilder extends AbstractColumnDefinitionBuilder public function buildType(ColumnInterface $column): string { + if ($column instanceof EnumColumn) { + $dbType = $this->getDbType($column); + if ($dbType === 'enum') { + $values = array_map( + $this->queryBuilder->getQuoter()->quoteValue(...), + $column->getValues(), + ); + return $dbType . '(' . implode(',', $values) . ')'; + } + } + $dbType = parent::buildType($column); if (!$column instanceof StringColumn || empty($column->getCharacterSet())) { @@ -72,6 +84,20 @@ public function buildType(ColumnInterface $column): string return "$dbType CHARACTER SET " . $column->getCharacterSet(); } + protected function buildCheck(ColumnInterface $column): string + { + $check = $column->getCheck(); + + if ($column instanceof EnumColumn && $column->getDbType() === null && empty($check)) { + $dbType = $this->getDbType($column); + if ($dbType === 'enum') { + return ''; + } + } + + return parent::buildCheck($column); + } + protected function buildComment(ColumnInterface $column): string { $comment = $column->getComment(); @@ -107,6 +133,7 @@ protected function getDbType(ColumnInterface $column): string ColumnType::ARRAY => 'json', ColumnType::STRUCTURED => 'json', ColumnType::JSON => 'json', + ColumnType::ENUM => 'enum', default => 'varchar', }; diff --git a/tests/Column/EnumColumnTest.php b/tests/Column/EnumColumnTest.php new file mode 100644 index 00000000..f5fcea6b --- /dev/null +++ b/tests/Column/EnumColumnTest.php @@ -0,0 +1,56 @@ + 'abc')"])] + public function testNonEnumCheck(string $columnDefinition): void + { + $this->dropTable('test_enum_table'); + $this->executeStatements( + <<getSharedConnection(); + $column = $db->getTableSchema('test_enum_table')->getColumn('status'); + + $this->assertNotInstanceOf(EnumColumn::class, $column); + + $this->dropTable('test_enum_table'); + } + + protected function createDatabaseObjectsStatements(): array + { + return [ + << new StringColumn( + 'enum_col' => new EnumColumn( dbType: 'enum', characterSet: 'utf8mb4', collation: 'utf8mb4_general_ci', - enumValues: ['a', 'B', 'c,D'], + values: ['a', 'B', 'c,D'], ), 'float_col' => new DoubleColumn( dbType: 'double', From 17bf247c45368967849c855d3dfab9104097db58 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 28 Nov 2025 09:26:36 +0300 Subject: [PATCH 2/3] fix --- src/Column/ColumnDefinitionBuilder.php | 2 +- tests/Column/ColumnDefinitionBuilderTest.php | 40 ++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/Column/ColumnDefinitionBuilderTest.php diff --git a/src/Column/ColumnDefinitionBuilder.php b/src/Column/ColumnDefinitionBuilder.php index 8879771d..f767e84b 100644 --- a/src/Column/ColumnDefinitionBuilder.php +++ b/src/Column/ColumnDefinitionBuilder.php @@ -66,7 +66,7 @@ public function buildType(ColumnInterface $column): string { if ($column instanceof EnumColumn) { $dbType = $this->getDbType($column); - if ($dbType === 'enum') { + if (strtolower($dbType) === 'enum') { $values = array_map( $this->queryBuilder->getQuoter()->quoteValue(...), $column->getValues(), diff --git a/tests/Column/ColumnDefinitionBuilderTest.php b/tests/Column/ColumnDefinitionBuilderTest.php new file mode 100644 index 00000000..7742cc8d --- /dev/null +++ b/tests/Column/ColumnDefinitionBuilderTest.php @@ -0,0 +1,40 @@ + ['int', new IntegerColumn()]; + yield 'enum' => ["enum('a','b','c')", new EnumColumn(values: ['a', 'b', 'c'])]; + yield 'enum-upper-case' => ["ENUM('a','b','c')", new EnumColumn(dbType: 'ENUM', values: ['a', 'b', 'c'])]; + } + + #[DataProvider('dataBuild')] + public function testBuild(string $expected, ColumnInterface $column): void + { + $builder = $this->createColumnDefinitionBuilder(); + + $result = $builder->build($column); + + $this->assertSame($expected, $result); + } + + private function createColumnDefinitionBuilder(): ColumnDefinitionBuilder + { + return new ColumnDefinitionBuilder( + TestConnection::getShared()->getQueryBuilder(), + ); + } +} From c973627e04eb1b60ba3751743e632745c1ea0757 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 29 Nov 2025 13:28:15 +0300 Subject: [PATCH 3/3] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8da79f5..91a31a12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ - Chg #428: Update expression namespaces according to changes in `yiisoft/db` package (@Tigrov) - Enh #432, #433: Update `DMLQueryBuilder::update()` method to adapt changes in `yiisoft/db` (@rustamwin, @Tigrov) - Enh #439: Move "Packets out of order" warning suppression from Yii DB (@vjik) +- New #448: Add enumeration column type support (@vjik) ## 1.2.0 March 21, 2024