我的数据库架构中有几列具有位数据类型,并且在Doctrine2映射时出现问题。我一直在说:
请求未知的数据库类型位,Doctrine \ DBAL \ Platforms \ MySqlPlatform可能不支持它。
有什么工作吗?我只是想将数据类型更改为boolean并使用true和false语句,但这意味着要大规模地更改模式,而我没有时间。
答案 0 :(得分:31)
在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
答案 1 :(得分:10)
如果您使用BIT
列来存储boolean
,请执行以下操作:
// get currently used platform
$dbPlatform = $em->getConnection()->getDatabasePlatform();
// interpret BIT as boolean
$dbPlatform->registerDoctrineTypeMapping('bit', 'boolean');
现在,每次将属性映射到位列时,doctrine 2都会将其值解释为布尔值。
答案 2 :(得分:6)
您可以为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的documentation pages
答案 3 :(得分:1)
请按照以下步骤解决此问题:
1)像在Linux场景中一样,在以下位置打开文件:
var \ www \ html \ admin \ libraries \ Composer \ vendor \ doctrine \ dbal \ lib \ Doctrine \ DBAL \ Platforms \ MySqlPlatform.php
2)转到此函数initializeDoctrineTypeMappings()
3)不能简单地添加您的映射项,就像我在我的情况下使用如下所示的布尔值映射位一样:
'bit'=>'boolean',
4)重新加载您的应用程序,它将起作用。
答案 4 :(得分:0)
我建议改用整数或位字符串(尽管这不允许您对其进行位操作)。
这是一个完整的例子:
Python3
然后像这样在namespace App\Type;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class BitType extends Type {
const BIT = "bit";
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
return self::BIT;
}
public function convertToPHPValue($value, AbstractPlatform $platform) {
return (int)$value; // alt. return decbin( $value);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform) {
return (int)$value; // alt. return bindec( $value);
}
public function getName() {
return self::BIT;
}
}
中注册它:
doctrine.yaml