用于映射MySql“位”数据类型的Doctrine2解决方法

时间:2012-03-16 21:16:22

标签: mysql mapping doctrine-orm

我的数据库架构中有几列具有位数据类型,并且在Doctrine2映射时出现问题。我一直在说:

  

请求未知的数据库类型位,Doctrine \ DBAL \ Platforms \ MySqlPlatform可能不支持它。

有什么工作吗?我只是想将数据类型更改为boolean并使用true和false语句,但这意味着要大规模地更改模式,而我没有时间。

5 个答案:

答案 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创建自己的自定义类型。

  1. 通过扩展Doctrine\DBAL\Types\Type类来创建新类型。
  2. 覆盖convertToPHPValue()convertToDatabaseValue()方法。
  3. 注册新类型:

    \Doctrine\DBAL\Types\Type::addType('abc', 'Your\\Custom\\Type\\AbcType');
    
    $dbPlatform = $em->getConnection()->getDatabasePlatform();
    $dbPlatform->registerDoctrineTypeMapping('abc', 'abc');
    
  4. 详细了解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