В приложении у меня есть случай Наследование таблицы классов. Столбец дискриминатора - это 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?




