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

问题描述 投票:0回答:5

我的数据库模式中有几列具有位数据类型,并且在 Doctrine2 映射它时遇到问题。我不断得到:

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

有什么解决办法吗?我正在考虑将数据类型更改为布尔值,并仅使用 true 和 false 语句,但这意味着大规模更改模式,而我没有时间。

mysql mapping doctrine-orm
5个回答
38
投票

在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

12
投票

如果您使用

BIT
列来存储
boolean
,请执行以下操作:

// get currently used platform
$dbPlatform = $em->getConnection()->getDatabasePlatform();

// interpret BIT as boolean
$dbPlatform->registerDoctrineTypeMapping('bit', 'boolean');

现在,每次将属性映射到位列时,原则 2 都会将其值解释为布尔值。


7
投票

您可以为 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');
    

在 Doctrine 的 文档页面上阅读更多内容


2
投票

请按照以下步骤解决此问题:

  1. 在以下位置打开文件,就像在 Linux 场景中一样,路径为:
    var\www\html\admin\libraries\Composer\vendor\doctrine\dbal\lib\Doctrine\DBAL\Platforms\MySqlPlatform.php
  2. 转到此功能
    initializeDoctrineTypeMappings()
  3. 现在只需添加映射条目,就像在我的例子中,我使用布尔值映射位,如下所示:
    'bit' => 'boolean',
    
  4. 重新加载您的应用程序即可运行

0
投票

我建议使用整数或位字符串(尽管这不允许您对其进行位操作)。

这是一个完整的示例:

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
© www.soinside.com 2019 - 2024. All rights reserved.