如何将descriminator列定义为类表继承的枚举?

qf9go6mv  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(331)

我想实现类表继承:

/**
 * Foo
 *
 * @ORM\Table(name="foos", ...)
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *     "bar" = "Bar",
 *     "buz" = "Buz"
 * })
 */
abstract class Foo
{
    ...
}

因为我采用了“代码优先”的方法,所以数据库是由条令生成的:

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

鉴别器列 foos.type 获取类型 VARCHAR(255) . 我想让它有一个 ENUM 相反。
如何为实体类定义注解以获取 ENUM 鉴别器?

gab6jxml

gab6jxml1#

回答有点晚,但解决方案是注册一个自定义Map类型,它将在数据库端实际使用enum。最简单的是:

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

在你的条令配置中的一些 your_type 名称和用途:

@ORM\DiscriminatorColumn(name="type", type="your_type")

默认情况下,此字段不为空。对于mysql,它将使用enum中的第一个值作为默认值,就像“隐式默认值”

d7v8vwbk

d7v8vwbk2#

它与 columnDefinition="ENUM('bar', 'buz')" :

/**
 * Foo
 *
 * @ORM\Table(name="foos", ...)
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string", columnDefinition="ENUM('bar', 'buz')")
 * @ORM\DiscriminatorMap({
 *     "bar" = "Bar",
 *     "buz" = "Buz"
 * })
 */
abstract class Foo
{
    ...
}

不幸的是,它会引起令人讨厌的副作用。同样在这里):理论的迁移机制似乎可以处理 ENUM 这是不正确的。这个 doctrine: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 .

相关问题