我的数据库模式中有几列具有位数据类型,并且在 Doctrine2 映射它时遇到问题。我不断得到:
请求未知数据库类型位,Doctrine\DBAL\Platforms\MySqlPlatform 可能不支持。
有什么解决办法吗?我正在考虑将数据类型更改为布尔值,并仅使用 true 和 false 语句,但这意味着大规模更改模式,而我没有时间。
在config.yml中使用mapping_types
doctrine:
dbal:
driver: %% database_driver
host: %% database_host
port: %% database_port
dbname: % database_name%
user: %% database_user
password: %% database_password
charset: UTF8
mapping_types:
bit: boolean
如果您使用
BIT
列来存储 boolean
,请执行以下操作:
// get currently used platform
$dbPlatform = $em->getConnection()->getDatabasePlatform();
// interpret BIT as boolean
$dbPlatform->registerDoctrineTypeMapping('bit', 'boolean');
现在,每次将属性映射到位列时,原则 2 都会将其值解释为布尔值。
您可以为 Doctrine 创建您自己的自定义类型。
Doctrine\DBAL\Types\Type
类创建新类型。convertToPHPValue()
和 convertToDatabaseValue()
方法。注册新类型:
\Doctrine\DBAL\Types\Type::addType('abc', 'Your\\Custom\\Type\\AbcType');
$dbPlatform = $em->getConnection()->getDatabasePlatform();
$dbPlatform->registerDoctrineTypeMapping('abc', 'abc');
在 Doctrine 的 文档页面上阅读更多内容
请按照以下步骤解决此问题:
var\www\html\admin\libraries\Composer\vendor\doctrine\dbal\lib\Doctrine\DBAL\Platforms\MySqlPlatform.php
initializeDoctrineTypeMappings()
'bit' => 'boolean',
我建议使用整数或位字符串(尽管这不允许您对其进行位操作)。
这是一个完整的示例:
namespace App\Type;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class BitType extends Type {
public const BIT = "bit";
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
return self::BIT;
}
public function convertToPHPValue($value, AbstractPlatform $platform) {
if(is_null($value)){
return $value;
}
return (int)$value; // alt. return decbin( $value);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform) {
if(is_null($value)){
return $value;
}
return (int)$value; // alt. return bindec( $value);
}
public function getName() {
return static::BIT;
}
}
然后像这样在
doctrine.yaml
中注册它:
doctrine:
dbal:
# [...] other configs here
types:
bit: App\Type\BitType
mapping_types:
bit: bit