mysql - 如何将描述符列定义为 Doctrine 中类表继承的 ENUM?
问题描述
我想实现类表继承:
/**
* 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
判别器?
解决方案
它适用于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 的迁移机制似乎处理ENUM
s 不正确。该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
.
推荐阅读
- c++ - 在 C++ 中按名称从页面源获取页面信息
- javascript - Search input onchange causes crashing - how to make it a button to submit search
- c# - CQRS 模式中的 Resharper 导航
- ag-grid - Ag-Grid - 从 RowNode 获取单元格列表
- php - 通过 Laravel 刀片视图中的多个关系获取外键名称
- json - 从 API 到 React-Native 的 HTML
- angular - Safari 面临 Angular 8 的 MSAL 登录问题,登录在 chrome、edge 中工作正常
- css - 如何让除法和数学函数在更少的时间内处理可变映射项
- java - 使用侦听器无构造函数初始化片段
- angular - 如何根据 ionic 4 中的日期推送日历上的数据计数