Как заставить Doctrine правильно обрабатывать ENUM?

В приложении у меня есть случай Наследование таблицы классов. Столбец дискриминатора представляет собой ENUM:

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

Доктрина работает, как и ожидалось (для начала). Команда doctrine:migrations:diff создает миграцию для таблиц и отношений, а также правильно определяет столбец дискриминатора как ENUM.

Затем я выполняю миграции (doctrine:migrations:migrate). Схема выглядит хорошо. Но:

Когда я снова выполняю команду 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');
    }
}

Ладно, выполняю. И снова попробуйте команду diff. И получить ту же самую миграцию, сгенерированную снова... Итак, Doctrine, кажется, "думает", столбец по-прежнему VARCHAR.

Я показал проблему здесь на примере дискриминатора наследования. Но на самом деле не имеет значения, является столбец дискриминатором или нет — это поведение одинаково для каждого столбца ENUM.

Как решить эту проблему? Есть ли способ заставить Doctrine правильно обрабатывать ENUM столбцов?


person automatix    schedule 19.06.2018    source источник