在一个应用程序中我有一个案例类表继承 https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html#class-table-inheritance。鉴别器列是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
column.
如何解决这个问题?有没有办法让 Doctrine 处理ENUM
列正确吗?