Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 原则DBAL、diff命令和枚举类型_Php_Symfony_Doctrine Migrations_Doctrine Dbal - Fatal编程技术网

Php 原则DBAL、diff命令和枚举类型

Php 原则DBAL、diff命令和枚举类型,php,symfony,doctrine-migrations,doctrine-dbal,Php,Symfony,Doctrine Migrations,Doctrine Dbal,我正在使用symfony 5.1、条令包2.1.2和条令迁移包2.2。我没有使用ORM并定义自己的模式。要添加枚举类型,我使用以下代码: 抽象类EnumType扩展类型 { 受保护字符串$name; 公共函数getSQLDeclaration(数组$fieldDeclaration,抽象平台$platform) { $values=$this->getValues(); $maxLength=max(数组映射('strlen',$values)); $columnName=$fieldDecla

我正在使用symfony 5.1、条令包2.1.2和条令迁移包2.2。我没有使用ORM并定义自己的模式。要添加枚举类型,我使用以下代码:

抽象类EnumType扩展类型
{
受保护字符串$name;
公共函数getSQLDeclaration(数组$fieldDeclaration,抽象平台$platform)
{
$values=$this->getValues();
$maxLength=max(数组映射('strlen',$values));
$columnName=$fieldDeclaration['name'];
$implodedValues=implode(',',数组_映射(函数($value){return“$value';},$values));
if($MySqlPlatform的平台实例){
返回“ENUM($infradedValues)”;
}
如果(
$SQLServer2012平台的平台实例
||$platform instanceof PostgreSQL94Platform
) {
返回“VARCHAR($maxLength)CHECK({$columnName}IN($implodedValues))”;
}
if($SqlitePlatform的平台实例){
返回“文本检查({$columnName}IN($inpulodedValues))”;
}
抛出DBALException::invalidPlatformType($platform);
}
公共函数convertToPHPValue($value,AbstractPlatform$platform)
{
返回$value;
}
公共函数convertToDatabaseValue($value,AbstractPlatform$platform)
{
如果(!在数组($value,$this->getValues())中){
抛出新的\InvalidArgumentException(“无效”。$this->name。“”值:“(字符串)$value);
}
返回$value;
}
公共函数getName()
{
返回$this->name;
}
公共函数requireSqlCommentHint(AbstractPlatform$platform)
{
返回true;
}
抽象函数getValues():数组;
}
然后,每个枚举扩展这个抽象类以设置值

创造没有问题。运行migration diff命令时,我收到以下错误消息:

请求的未知数据库类型enum,条令\DBAL\Platforms\MySQL57Platform可能不支持它。


你知道如何创建一个包含对枚举本身的任何更改的diff吗?

我通过创建自己的diff解决了这个问题,该diff首先添加“enum”类型(如果还没有),使用:

if($connection->getDatabasePlatform()MySqlPlatform实例){
如果(!Type::hasType('enum')){
类型::addType('enum',StringType::class);
}
$connection->getDatabasePlatform()->registerDoctrineTypeMapping('enum',Types::STRING);
}
之后,我尝试读取所有可用表,捕捉未定义类型的任何异常,将其定义为字符串,然后重试:

$schemaManager=$this->connection->getSchemaManager();
做{
试一试{
返回新模式($schemaManager->listTables(),[],$schemaManager->createSchemaConfig());
}捕获(异常$Exception){
$hasErrors=true;
$message=$exception->getMessage();
$parts=分解(“,$message);
//将任何删除的自定义类型转换为字符串
Type::addType($parts[1],StringType::class);
}
}而(错误),;
这将返回当前数据库架构。从中可以使用新架构创建差异