首页 > 解决方案 > 如何将描述符列定义为 Doctrine 中类表继承的 ENUM?

问题描述

我想实现类表继承

/**
 * 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
{
    ...
}

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

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

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

如何定义实体类的注解来获取ENUM判别器?

标签: mysqlinheritanceenumsdoctrine-ormclass-table-inheritance

解决方案


它适用于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
{
    ...
}

不幸的是,它导致了一个恼人的副作用(s.也在这里):Doctrine 的迁移机制似乎处理ENUMs 不正确。该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会再次创建具有相同内容的迁移......意味着,Doctrine “认为”,该列仍然是VARCHAR.


推荐阅读