Doctrine 对具有 ENUM 类型的实体进行了不正确的区分
The Doctrine make a not correct diff for an entity with ENUM type
我为实体 Command 属性 type 做了一个特殊的 ENUM
类型 cookbook.
属性 看起来像这样:
/**
* @var CommandType
*
* @ORM\Column(type="command_type")
*/
protected $type;
这段代码描述了新的学说类型:
final class CommandTypeType extends EnumerableType
{
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'VARCHAR(30)';
}
public function getName(): string
{
return 'command_type';
}
protected function getClassName(): string
{
return CommandType::class;
}
}
在实体的第一个 运行 命令 /bin/console doctrine:migrations:diff
之后,我得到了迁移,它看起来是正确的
final class Version2020 072720500 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$this->addSql("CREATE TABLE commands (
id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(30) DEFAULT NULL,
command VARCHAR(100) DEFAULT NULL,
type varchar(30) NOT NULL,
PRIMARY KEY(id)
) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB");
}
public function down(Schema $schema) : void
{
$this->addSql('DROP TABLE commands');
}
}
下一步是 运行 命令 /bin/console doctrine:migrations:migrate
它工作正常,table 创建。
然后我运行再次命令/bin/console doctrine:migrations:diff
并获得新的迁移
final class Version20200727205035 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$this->addSql('ALTER TABLE commands CHANGE type type VARCHAR(30) NOT NULL');
}
public function down(Schema $schema) : void
{
$this->addSql('ALTER TABLE commands CHANGE type type VARCHAR(30) CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`');
}
}
我不知道为什么第二个 diff 会产生这个奇怪的迁移。
我做错了什么?
- Symfony 4.4
- doctrine/doctrine-migrations-bundle 3.0.1
- doctrine/migrations 3.0.1
Doctrine 需要将注释添加到该列以检测自定义类型已应用于该列。
检查 requiresSQLCommentHint
方法是否已实现并且 returns 为真或将其添加到您的自定义类型。
final class CommandTypeType extends EnumerableType
{
...
public function requiresSQLCommentHint(AbstractPlatform $platform): bool
{
return true;
}
}
您应该会在下一次迁移时看到要添加到您的专栏中的评论,仅此而已。
我为实体 Command 属性 type 做了一个特殊的 ENUM
类型 cookbook.
属性 看起来像这样:
/**
* @var CommandType
*
* @ORM\Column(type="command_type")
*/
protected $type;
这段代码描述了新的学说类型:
final class CommandTypeType extends EnumerableType
{
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'VARCHAR(30)';
}
public function getName(): string
{
return 'command_type';
}
protected function getClassName(): string
{
return CommandType::class;
}
}
在实体的第一个 运行 命令 /bin/console doctrine:migrations:diff
之后,我得到了迁移,它看起来是正确的
final class Version2020 072720500 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$this->addSql("CREATE TABLE commands (
id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(30) DEFAULT NULL,
command VARCHAR(100) DEFAULT NULL,
type varchar(30) NOT NULL,
PRIMARY KEY(id)
) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB");
}
public function down(Schema $schema) : void
{
$this->addSql('DROP TABLE commands');
}
}
下一步是 运行 命令 /bin/console doctrine:migrations:migrate
它工作正常,table 创建。
然后我运行再次命令/bin/console doctrine:migrations:diff
并获得新的迁移
final class Version20200727205035 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$this->addSql('ALTER TABLE commands CHANGE type type VARCHAR(30) NOT NULL');
}
public function down(Schema $schema) : void
{
$this->addSql('ALTER TABLE commands CHANGE type type VARCHAR(30) CHARACTER SET utf8 NOT NULL COLLATE `utf8_unicode_ci`');
}
}
我不知道为什么第二个 diff 会产生这个奇怪的迁移。
我做错了什么?
- Symfony 4.4
- doctrine/doctrine-migrations-bundle 3.0.1
- doctrine/migrations 3.0.1
Doctrine 需要将注释添加到该列以检测自定义类型已应用于该列。
检查 requiresSQLCommentHint
方法是否已实现并且 returns 为真或将其添加到您的自定义类型。
final class CommandTypeType extends EnumerableType
{
...
public function requiresSQLCommentHint(AbstractPlatform $platform): bool
{
return true;
}
}
您应该会在下一次迁移时看到要添加到您的专栏中的评论,仅此而已。