0

我想实现类表继承

/**
 * 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判别器?

4

2 回答 2

1

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

于 2018-06-19T21:11:38.423 回答
1

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

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

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

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

该字段默认为 NOT NULL。在 mysql 的情况下,它将使用 ENUM 中的第一个值作为默认值,例如“隐式默认值”

于 2020-09-02T12:08:26.920 回答