如何在学说中将描述符列定义为类表继承的枚举?



我想实现类表继承:

/**
* Foo
*
* @ORMTable(name="foos", ...)
* @ORMEntity
* @ORMInheritanceType("JOINED")
* @ORMDiscriminatorColumn(name="type", type="string")
* @ORMDiscriminatorMap({
*     "bar" = "Bar",
*     "buz" = "Buz"
* })
*/
abstract class Foo
{
...
}

由于我运行"代码优先"方法,因此数据库由 Doctrine 生成:

$ bin/console doctrine:migrations:diff
$ bin/console doctrine:migrations:migrate

鉴别器列foos.type获取类型VARCHAR(255)。我希望它得到一个ENUM

如何定义实体类的注释以获取ENUM鉴别器?

它适用于columnDefinition="ENUM('bar', 'buz')"

/**
* Foo
*
* @ORMTable(name="foos", ...)
* @ORMEntity
* @ORMInheritanceType("JOINED")
* @ORMDiscriminatorColumn(name="type", type="string", columnDefinition="ENUM('bar', 'buz')")
* @ORMDiscriminatorMap({
*     "bar" = "Bar",
*     "buz" = "Buz"
* })
*/
abstract class Foo
{
...
}

不幸的是,它会导致一个烦人的副作用(也在这里(:教义的迁移机制似乎不正确地处理ENUMdoctrine:migrations:diff命令创建如下所示的迁移:

final class Version20180619205625 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$this->addSql('ALTER TABLE foos CHANGE type `type` ENUM('bar', 'buz')');
}
public function down(Schema $schema) : void
{
$this->addSql('ALTER TABLE tasks CHANGE `type` type VARCHAR(255) DEFAULT NULL COLLATE utf8mb4_unicode_ci');
}
}

我执行它,type列成为ENUM.但是,新的doctrine:migrations:diff执行会再次创建具有相同内容的迁移...意思是,学说"思考",专栏还在VARCHAR.

有点晚了,但解决方案是注册一个自定义映射类型,该类型将在数据库端实际使用 ENUM。最简单的是:

class YourType extends Type
{
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string
{
return 'ENUM('one', 'two')';
}
}

以某种your_type名称在您的 Doctrine 配置中注册它并使用:

@ORMDiscriminatorColumn(name="type", type="your_type")

默认情况下,此字段不会为 NULL。在mysql的情况下,它将使用ENUM的第一个值作为默认值,例如"隐式默认值">

相关内容

  • 没有找到相关文章

最新更新