代码之家  ›  专栏  ›  技术社区  ›  automatix

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

  •  0
  • automatix  · 技术社区  · 7 年前

    我想实施 Class Table Inheritance :

    /**
     * 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 相反。

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   automatix    7 年前

    它与 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
    {
        ...
    }
    

    不幸的是,它会引起令人讨厌的副作用 here ):理论的迁移机制似乎可以处理 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 列变为 枚举 . 但是一个新的 教义:迁徙:差异 再次创建具有相同内容的迁移。。。意思,教条“思”,栏目还是 VARCHAR .