Doctrine 自定义 MariaDB 平台
Doctrine Custom MariaDB Platform
我在现有 MariaDb1027Platform
的基础上使用自定义 getDefaultValueDeclarationSQL
方法创建了 CustomDbPlatform
扩展 MySqlPlatform
。我无法扩展 MariaDbPlatform
,因为它是最终的 class。
class CustomDbPlatform extends MySqlPlatform
{
public function getJsonTypeDeclarationSQL(array $column): string
{
return 'LONGTEXT';
}
protected function getReservedKeywordsClass(): string
{
return MariaDb102Keywords::class;
}
protected function initializeDoctrineTypeMappings(): void
{
parent::initializeDoctrineTypeMappings();
$this->doctrineTypeMapping['json'] = Types::JSON;
}
public function getDefaultValueDeclarationSQL($column): string
{
if (isset($column['default'], $column['type'])) {
$default = $column['default'];
$type = $column['type'];
if ($type instanceof DateTimePrecisionType && stripos($default, $this->getCurrentTimestampSQL()) !== false) {
if (isset($column['length']) && $column['length'] > 0 && $column['length'] < 255) {
return ' DEFAULT ' . sprintf('%s(%d)', $this->getCurrentTimestampSQL(), $column['length']);
}
return ' DEFAULT ' . $this->getCurrentTimestampSQL();
}
}
return parent::getDefaultValueDeclarationSQL($column);
}
}
不幸的是,在架构更新期间,Doctrine 强制使用新的 table 列定义更新基本上整个架构。此问题是由专门检查 MariaDb1027Platform
.
的 MySqlSchemaManager
引起的
if ($this->_platform instanceof MariaDb1027Platform) {
$columnDefault = $this->getMariaDb1027ColumnDefault($this->_platform, $tableColumn['default']);
} else {
$columnDefault = $tableColumn['default'];
}
如何让 Doctrine 将我的 CustomDbPlatform
识别为 MariaDb1027Platform
?制作自定义 SchemaManager 似乎有点矫枉过正。
使用
- Symfony 4.4
- 学说 2
- MariaDB 10.3
如果要延长MariaDb1027Platform
,唯一的方法是:
- 从 https://github.com/doctrine/dbal/blob/3.1.x/src/Platforms/MariaDb1027Platform.php 复制平台 class 文件,
- 地点在您的项目中
- 删除
final
kw
- 在从 DBAL 库自动加载 class 之前加载此文件 - 您可以使用 composer autoload
files
部分
此外,我已经创建了 PR https://github.com/doctrine/dbal/pull/4909 以查看维护者是否愿意正式支持它。
我在现有 MariaDb1027Platform
的基础上使用自定义 getDefaultValueDeclarationSQL
方法创建了 CustomDbPlatform
扩展 MySqlPlatform
。我无法扩展 MariaDbPlatform
,因为它是最终的 class。
class CustomDbPlatform extends MySqlPlatform
{
public function getJsonTypeDeclarationSQL(array $column): string
{
return 'LONGTEXT';
}
protected function getReservedKeywordsClass(): string
{
return MariaDb102Keywords::class;
}
protected function initializeDoctrineTypeMappings(): void
{
parent::initializeDoctrineTypeMappings();
$this->doctrineTypeMapping['json'] = Types::JSON;
}
public function getDefaultValueDeclarationSQL($column): string
{
if (isset($column['default'], $column['type'])) {
$default = $column['default'];
$type = $column['type'];
if ($type instanceof DateTimePrecisionType && stripos($default, $this->getCurrentTimestampSQL()) !== false) {
if (isset($column['length']) && $column['length'] > 0 && $column['length'] < 255) {
return ' DEFAULT ' . sprintf('%s(%d)', $this->getCurrentTimestampSQL(), $column['length']);
}
return ' DEFAULT ' . $this->getCurrentTimestampSQL();
}
}
return parent::getDefaultValueDeclarationSQL($column);
}
}
不幸的是,在架构更新期间,Doctrine 强制使用新的 table 列定义更新基本上整个架构。此问题是由专门检查 MariaDb1027Platform
.
MySqlSchemaManager
引起的
if ($this->_platform instanceof MariaDb1027Platform) {
$columnDefault = $this->getMariaDb1027ColumnDefault($this->_platform, $tableColumn['default']);
} else {
$columnDefault = $tableColumn['default'];
}
如何让 Doctrine 将我的 CustomDbPlatform
识别为 MariaDb1027Platform
?制作自定义 SchemaManager 似乎有点矫枉过正。
使用
- Symfony 4.4
- 学说 2
- MariaDB 10.3
如果要延长MariaDb1027Platform
,唯一的方法是:
- 从 https://github.com/doctrine/dbal/blob/3.1.x/src/Platforms/MariaDb1027Platform.php 复制平台 class 文件,
- 地点在您的项目中
- 删除
final
kw - 在从 DBAL 库自动加载 class 之前加载此文件 - 您可以使用 composer autoload
files
部分
此外,我已经创建了 PR https://github.com/doctrine/dbal/pull/4909 以查看维护者是否愿意正式支持它。