我的数据库架构中有几个列具有位数据类型,并且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创建自己的自定义类型。
- 通过扩展
DoctrineDBALTypesType
类创建一个新类型 - 覆盖
convertToPHPValue()
和convertToDatabaseValue()
方法 -
注册一个新类型:
DoctrineDBALTypesType::addType('abc', 'Your\Custom\Type\AbcType'); $dbPlatform = $em->getConnection()->getDatabasePlatform(); $dbPlatform->registerDoctrineTypeMapping('abc', 'abc');
阅读Doctrine文档页面
请按照以下步骤解决此问题:
1) 在以下位置打开文件,就像在linux场景中一样,路径是:
var\www\html\admin\librars\Composer\vendor\doctrine\dbal\lib\doctrine\dbal\Platforms\MySqlPlatform.php
2) 转到此函数initializeDoctrineTypeMappings()
3) 不简单地添加你的映射条目,就像在我的情况下,我用布尔值映射了比特,如下所示:
'bit'=>'boolean',
4) 重新加载你的应用程序,它就会工作。
我建议使用整数或位字符串(尽管这不允许对其进行位操作)。
下面是一个完整的例子:
namespace AppType;
use DoctrineDBALTypesType;
use DoctrineDBALPlatformsAbstractPlatform;
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: AppTypeBitType
mapping_types:
bit: bit