Doctrine 2 - 如何用新的枚举值更新模式?
Doctrine 2 - How to update schema with new enum values?
遵循 Doctrine 2 的枚举 defining a type 指南,我有以下 class:
class EnumStatusType extends EnumType
{
protected $name = 'enumStatusType';
protected $values = [
'active',
];
}
现在,使用 vendor/bin/doctrine-module migrations:diff
或 vendor/bin/doctrine-module orm:schema-tool:update
或您喜欢的任何一个,它成功地创建了带有枚举的列:
status ENUM(\'active\') COMMENT \'(DC2Type:enumStatusType)\' NOT NULL
现在,我想添加第二个值,inactive
。但是在 运行 orm:validate-schema
、orm:schema-tool:update
migrations:diff
、none 之后他们注意到有一个新值。
我怎样才能让它检测到这种类型的更改,以便可以使用 migrations:diff
进行新的迁移?
PS:我正在使用 ZF2
和 DoctrineORMModule
。但这并不重要。
您可以尝试在每个字段注释选项中添加枚举值列表,使用 postGenerateSchema event:
class EnumListener
{
public function postGenerateSchema(\Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs $eventArgs)
{
$columns = [];
foreach ($eventArgs->getSchema()->getTables() as $table) {
foreach ($table->getColumns() as $column) {
if ($column->getType() instanceof EnumType) {
$columns[] = $column;
}
}
}
/** @var \Doctrine\DBAL\Schema\Column $column */
foreach ($columns as $column) {
$column->setComment(trim(sprintf('%s (%s)', $column->getComment(), implode(',', $column->getType()->getEnum()::toArray()))));
}
}
}
适用于 orm:schema-tool:update
命令,我想它与 migrations:diff
相同
遵循 Doctrine 2 的枚举 defining a type 指南,我有以下 class:
class EnumStatusType extends EnumType
{
protected $name = 'enumStatusType';
protected $values = [
'active',
];
}
现在,使用 vendor/bin/doctrine-module migrations:diff
或 vendor/bin/doctrine-module orm:schema-tool:update
或您喜欢的任何一个,它成功地创建了带有枚举的列:
status ENUM(\'active\') COMMENT \'(DC2Type:enumStatusType)\' NOT NULL
现在,我想添加第二个值,inactive
。但是在 运行 orm:validate-schema
、orm:schema-tool:update
migrations:diff
、none 之后他们注意到有一个新值。
我怎样才能让它检测到这种类型的更改,以便可以使用 migrations:diff
进行新的迁移?
PS:我正在使用 ZF2
和 DoctrineORMModule
。但这并不重要。
您可以尝试在每个字段注释选项中添加枚举值列表,使用 postGenerateSchema event:
class EnumListener
{
public function postGenerateSchema(\Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs $eventArgs)
{
$columns = [];
foreach ($eventArgs->getSchema()->getTables() as $table) {
foreach ($table->getColumns() as $column) {
if ($column->getType() instanceof EnumType) {
$columns[] = $column;
}
}
}
/** @var \Doctrine\DBAL\Schema\Column $column */
foreach ($columns as $column) {
$column->setComment(trim(sprintf('%s (%s)', $column->getComment(), implode(',', $column->getType()->getEnum()::toArray()))));
}
}
}
适用于 orm:schema-tool:update
命令,我想它与 migrations:diff