MySql enum field throws error during migration
Bug Report
| Q | A |
|---|---|
| Version | 4.3 |
Summary
- Existing MySql enum field throws error during migration after upgrading from
4.2.4to4.3.
Current behavior
Column column name has invalid type
Expected behavior
- MySql enum fields are supported
- No error is thrown during migration
How to reproduce
- Create an enum field in MySql with an equivalent entity property e.g.
status
#[Column(type: "string", columnDefinition: "ENUM('visible', 'invisible')")]
private $status;
- Execute migration e.g.
php bin/console doctrine:migrations:migrate
What error do you have?
Can you post it with a stacktrace?
Column {column-name} has invalid type
Stacktrace:
./bin/console doctrine:migrations:migrate -vv --no-interaction
PHP Fatal error: Declaration of EnumVisibilityType::convertToDatabaseValue($value, Doctrine\DBAL\Platforms\AbstractPlatform $platform) must be compatible with Doctrine\DBAL\Types\Type::convertToDatabaseValue(mixed $value, Doctrine\DBAL\Platforms\AbstractPlatform $platform): mixed in /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/src/Bundle/ExternalProductsBundle/Entity/EnumVisibilityType.php on line 20
PHP Stack trace:
PHP 1. {main}() /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/bin/console:0
PHP 2. Symfony\Component\Console\Application->run($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 0; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = []; protected $interactive = FALSE; private array $tokens = [0 => 'doctrine:migrations:migrate', 1 => '-vv', 2 => '--no-interaction']; private array $parsed = *uninitialized* }, $output = *uninitialized*) /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/bin/console:100
PHP 3. Symfony\Bundle\FrameworkBundle\Console\Application->doRun($input = class Symfony\Component\Console\Input\ArgvInput { protected $definition = class Symfony\Component\Console\Input\InputDefinition { private array $arguments = [...]; private int $requiredCount = 0; private ?Symfony\Component\Console\Input\InputArgument $lastArrayArgument = NULL; private ?Symfony\Component\Console\Input\InputArgument $lastOptionalArgument = NULL; private array $options = [...]; private array $negations = [...]; private array $shortcuts = [...] }; protected $stream = NULL; protected $options = []; protected $arguments = []; protected $interactive = FALSE; private array $tokens = [0 => 'doctrine:migrations:migrate', 1 => '-vv', 2 => '--no-interaction']; private array $parsed = *uninitialized* }, $output = class Symfony\Component\Console\Output\ConsoleOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 128; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { private bool $decorated = TRUE; private array $styles = [...]; private Symfony\Component\Console\Formatter\OutputFormatterStyleStack $styleStack = class Symfony\Component\Console\Formatter\OutputFormatterStyleStack { ... } }; private ${Symfony\Component\Console\Output\StreamOutput}stream = resource(2) of type (stream); private Symfony\Component\Console\Output\OutputInterface $stderr = class Symfony\Component\Console\Output\StreamOutput { private int ${Symfony\Component\Console\Output\Output}verbosity = 128; private Symfony\Component\Console\Formatter\OutputFormatterInterface ${Symfony\Component\Console\Output\Output}formatter = class Symfony\Component\Console\Formatter\OutputFormatter { ... }; private $stream = resource(3) of type (stream) }; private array $consoleSectionOutputs = [] }) /home/bmratuszny/code/customizing-svv/vendor/symfony/console/Application.php:175
PHP 4. EosUptrade\TICKeos\Bundle\SymfonyOneBundle\Console\SymfonyOneAwareApplication->registerCommands() /home/bmratuszny/code/customizing-svv/vendor/symfony/framework-bundle/Console/Application.php:72
PHP 5. EosUptrade\TICKeos\Core\Kernel->boot() /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/src/Bundle/SymfonyOneBundle/Console/SymfonyOneAwareApplication.php:65
PHP 6. Symfony\Component\HttpKernel\Kernel->boot() /home/bmratuszny/code/customizing-svv/vendor/eosuptrade/tickeos/src/Core/Kernel.php:150
PHP 7. Symfony\Component\HttpKernel\Kernel->preBoot() /home/bmratuszny/code/customizing-svv/vendor/symfony/http-kernel/Kernel.php:126
PHP 8. Symfony\Component\HttpKernel\Kernel->initializeContainer() /home/bmratuszny/code/customizing-svv/vendor/symfony/http-kernel/Kernel.php:772
PHP 9. Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp($cacheDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev', $buildDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev', $io = *uninitialized*) /home/bmratuszny/code/customizing-svv/vendor/symfony/http-kernel/Kernel.php:554
PHP 10. Symfony\Bundle\FrameworkBundle\CacheWarmer\AbstractPhpFileCacheWarmer->warmUp($cacheDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev', '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev') /home/bmratuszny/code/customizing-svv/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php:108
PHP 11. Doctrine\Bundle\DoctrineBundle\CacheWarmer\DoctrineMetadataCacheWarmer->doWarmUp($cacheDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev', $arrayAdapter = class Symfony\Component\Cache\Adapter\ArrayAdapter { private bool $storeSerialized = TRUE; private array $values = []; private array $tags = []; private array $expiries = []; private int $defaultLifetime = 0; private float $maxLifetime = 0; private int $maxItems = 0; protected ?Psr\Log\LoggerInterface $logger = NULL }, $buildDir = '/home/bmratuszny/code/customizing-svv/var/cli/cache/dev') /home/bmratuszny/code/customizing-svv/vendor/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php:47
PHP 12. Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getAllMetadata() /home/bmratuszny/code/customizing-svv/vendor/doctrine/doctrine-bundle/src/CacheWarmer/DoctrineMetadataCacheWarmer.php:43
PHP 13. Doctrine\Bundle\DoctrineBundle\Mapping\MappingDriver->getAllClassNames() /home/bmratuszny/code/customizing-svv/vendor/doctrine/persistence/src/Persistence/Mapping/AbstractClassMetadataFactory.php:87
PHP 14. Doctrine\Persistence\Mapping\Driver\MappingDriverChain->getAllClassNames() /home/bmratuszny/code/customizing-svv/vendor/doctrine/doctrine-bundle/src/Mapping/MappingDriver.php:23
PHP 15. Doctrine\ORM\Mapping\Driver\AttributeDriver->getAllClassNames() /home/bmratuszny/code/customizing-svv/vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php:87
It looks like your EnumVisibilityType class is not compatible with the base Type class from DBAL 4 (see what was done in #5043).
It's surprising that you did not get an error with 4.2 already.
Closing as this is a problem on your side.
Sorry for the confusion, I was actually posting on behalf of a colleague (on vacation) who sent me the wrong stacktrace.
Actually, he tried to fix the enum issue by creating an EnumType as in this example. It failed and sent the stacktrace instead of the original one 😅
I tried to reproduce the original error. Here is the stacktrace :-)
[Doctrine\DBAL\Exception\InvalidColumnDeclaration]
Column "application" has invalid type
Exception trace:
at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Exception/InvalidColumnDeclaration.php:16
Doctrine\DBAL\Exception\InvalidColumnDeclaration::fromInvalidColumnType() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php:204
Doctrine\DBAL\Platforms\AbstractPlatform->getStringTypeDeclarationSQL() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Types/StringType.php:19
Doctrine\DBAL\Types\StringType->getSQLDeclaration() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php:1486
Doctrine\DBAL\Platforms\AbstractPlatform->getColumnDeclarationSQL() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php:2379
Doctrine\DBAL\Platforms\AbstractPlatform->columnsEqual() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Schema/Comparator.php:444
Doctrine\DBAL\Schema\Comparator->columnsEqual() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Schema/Comparator.php:196
Doctrine\DBAL\Schema\Comparator->compareTables() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Platforms/MySQL/Comparator.php:40
Doctrine\DBAL\Platforms\MySQL\Comparator->compareTables() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/dbal/src/Schema/Comparator.php:62
Doctrine\DBAL\Schema\Comparator->compareSchemas() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Provider/DBALSchemaDiffProvider.php:44
Doctrine\Migrations\Provider\DBALSchemaDiffProvider->getSqlDiffToMigrate() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Provider/LazySchemaDiffProvider.php:50
Doctrine\Migrations\Provider\LazySchemaDiffProvider->getSqlDiffToMigrate() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Version/DbalExecutor.php:144
Doctrine\Migrations\Version\DbalExecutor->executeMigration() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Version/DbalExecutor.php:72
Doctrine\Migrations\Version\DbalExecutor->execute() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/DbalMigrator.php:87
Doctrine\Migrations\DbalMigrator->executePlan() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/DbalMigrator.php:54
Doctrine\Migrations\DbalMigrator->executeMigrations() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/DbalMigrator.php:134
Doctrine\Migrations\DbalMigrator->migrate() at /builds/iGct5bTxq/21/php/TICK/core/vendor/doctrine/migrations/src/Tools/Console/Command/MigrateCommand.php:225
Doctrine\Migrations\Tools\Console\Command\MigrateCommand->execute() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/console/Command/Command.php:326
Symfony\Component\Console\Command\Command->run() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/console/Application.php:1096
Symfony\Component\Console\Application->doRunCommand() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/framework-bundle/Console/Application.php:126
Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/console/Application.php:324
Symfony\Component\Console\Application->doRun() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/framework-bundle/Console/Application.php:80
Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /builds/iGct5bTxq/21/php/TICK/core/vendor/symfony/console/Application.php:175
Symfony\Component\Console\Application->run() at /builds/iGct5bTxq/21/php/TICK/core/bin/console:99
@derrabus Could you please reopen the issue? I posted the correct stacktrace.