php - Doctrine DBAL、diff 命令和枚举类型
问题描述
我正在使用 symfony 5.1、教义捆绑包 2.1.2 和教义迁移捆绑包 2.2。我没有使用 ORM 并定义我自己的模式。要添加枚举类型,我使用以下代码:
abstract class EnumType extends Type
{
protected string $name;
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
$values = $this->getValues();
$maxLength = max(array_map('strlen', $values));
$columnName = $fieldDeclaration['name'];
$implodedValues = implode(', ', array_map(function($value) {return "'$value'";}, $values));
if ($platform instanceof MySqlPlatform) {
return "ENUM($implodedValues)";
}
if (
$platform instanceof SQLServer2012Platform
|| $platform instanceof PostgreSQL94Platform
) {
return "VARCHAR($maxLength) CHECK ({$columnName} IN ($implodedValues))";
}
if ($platform instanceof SqlitePlatform) {
return "TEXT CHECK ({$columnName} IN ($implodedValues))";
}
throw DBALException::invalidPlatformType($platform);
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (!in_array($value, $this->getValues())) {
throw new \InvalidArgumentException("Invalid '" . $this->name . "' value: " . (string)$value);
}
return $value;
}
public function getName()
{
return $this->name;
}
public function requiresSQLCommentHint(AbstractPlatform $platform)
{
return true;
}
abstract function getValues(): array;
}
然后每个枚举扩展这个抽象类来设置值。
创作不是问题。当我运行迁移差异命令时,我收到以下错误消息:
请求的未知数据库类型枚举,Doctrine\DBAL\Platforms\MySQL57Platform 可能不支持它。
有什么想法可以创建一个包含对枚举本身的任何更改的差异吗?
解决方案
我通过创建自己的差异解决了这个问题,如果还没有使用,首先添加“枚举”类型:
if ($connection->getDatabasePlatform() instanceof MySqlPlatform) {
if (!Type::hasType('enum')) {
Type::addType('enum', StringType::class);
}
$connection->getDatabasePlatform()->registerDoctrineTypeMapping('enum', Types::STRING);
}
之后,我尝试读取所有可用的表,并捕获未定义类型的任何异常,将其定义为字符串,然后重试:
$schemaManager = $this->connection->getSchemaManager();
do {
try {
return new Schema($schemaManager->listTables(), [], $schemaManager->createSchemaConfig());
} catch (Exception $exception) {
$hasErrors = true;
$message = $exception->getMessage();
$parts = explode('"', $message);
// convert any removed custom type to string
Type::addType($parts[1], StringType::class);
}
} while ($hasErrors);
这将返回当前的数据库模式。可以使用新架构从中创建差异。
推荐阅读
- vue.js - 即使从应用程序外部输入数据,也不会反映
- android - 为什么在这个自定义版本的 android 中有些 UI 按钮是可点击的,而另一些是不可点击的?
- intellij-idea - Intellij - 无法克隆存储库“克隆失败 - 无法访问 '<
> ':接收失败:连接已重置 - javascript - 如何有条件地渲染对话框 Material-ui
- python - 设置从 github 导入的库时遇到问题
- java - Eclipse 市场的 Spring 工具套件上没有 SQL 开发工具
- c++ - 类模板和友谊
- concurrent.futures - python Future 对象到底是什么?
- docker - Gitlab CI 将文件从 repo 复制到管道并将其提取到路径
- android - React Native - NSExceptionMinimumTLSVersion 等价于 Android