Description
Bug Report
Q | A |
---|---|
BC Break | no |
Migrations version | 3.8.0 |
Migrations bundle | 3.3.1 |
ORM | 3.2.1 |
DBAL | 4.0.4 |
Symfony | 7.1.2 |
Summary
I have issue with DBAL 4 and custom type, the migrations keep getting generated again and again. Furthermore, the down migration looks totally bogus. This is possibly related to #1435
I know that DBAL 4 dropped requiresSqlHint (in doctrine/dbal#5107 , afterwards some issues were found and fixed - doctrine/dbal#6257 )
So when I am using custom type, I expect the first migration diff to drop the DC2Type
comments. However my tables have these fields already dropped and yet the migration is being generated.
enum ActionType: string
{
case SUBMIT = 'submit';
case CANCEL = 'cancel';
}
class ActionTypeType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
$class = ActionType::class;
$values = [];
foreach ($class::cases() as $val) {
$values[] = "'{$val->value}'";
}
return "enum(" . implode(", ", $values) . ")";
}
public function convertToDatabaseValue($value, AbstractPlatform $platform): mixed
{
$class = ActionType::class;
if ($value !== null && !($value instanceof BackedEnum)) {
$value = $class::tryFrom($value);
}else{
return null;
}
return $value->value;
}
public function convertToPHPValue($value, AbstractPlatform $platform): ?BackedEnum
{
if ((!is_int($value)) && !is_string($value)) {
return null;
}
return $class::tryFrom($value);
}
}
I then have my entity as
#[ORM\Entity(repositoryClass: ActionRepository::class)]
#[ORM\Table(name: 'actions')]
class Action
{
#[ORM\Id]
private string $name;
#[ORM\Column(type: ActionType::class, nullable: false)]
private ActionType $type;
}
and in Kernel.php
I set up type mapping inside Kernel::process()
:
$typesDefinition[ActionType::class] = ['class' => ActionTypeType::class];
$container->setParameter('doctrine.dbal.connection_factory.types', $typesDefinition);
Now I know that the types are assigned correctly, as migrations generate up like this:
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE actions CHANGE type type enum(\'submit\', \'cancel\') NOT NULL');
}
but it is generated ALWAYS.
and the down()
migration looks even weirder:
public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE actions CHANGE type type VARCHAR(0) NOT NULL');
}
Everything works fine with DBAL 3, which uses SQL comments
Activity