MapMySql“bit”数据类型的Doctrine2解决方法

but5z9lq  于 2023-03-07  发布在  Mysql
关注(0)|答案(5)|浏览(130)

我的数据库模式中有一些列具有bit数据类型,并且在Doctrine2Map时遇到问题。
请求了未知的数据库类型位,Doctrine\DBAL\Platforms\MySqlPlatform可能不支持它。
有什么解决办法吗?我想只把数据类型改成布尔型,只使用真和假语句,但这将意味着大规模地改变模式,我没有时间。

shyt4zoc

shyt4zoc1#

在配置yml中使用Map类型

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
9q78igpj

9q78igpj2#

如果您使用BIT列来存储boolean,请执行以下操作:

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

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

现在,每当你把一个属性Map到位列时,教条2会把它的值解释为布尔值。

euoag5mw

euoag5mw3#

您可以为Doctrine创建自己的自定义类型。
1.通过扩展Doctrine\DBAL\Types\Type类创建新类型。
1.重写convertToPHPValue()convertToDatabaseValue()方法。
1.注册新类型:

\Doctrine\DBAL\Types\Type::addType('abc', 'Your\\Custom\\Type\\AbcType');

$dbPlatform = $em->getConnection()->getDatabasePlatform();
$dbPlatform->registerDoctrineTypeMapping('abc', 'abc');

阅读更多关于Doctrine documentation pages的信息

ltqd579y

ltqd579y4#

请按照以下步骤解决此问题:
1)在以下位置打开文件,如在Linux场景中,路径为:
var\www\html\admin\libraries\Composer\vendor\doctrine\dbal\lib\Doctrine\DBAL\Platforms\MySqlPlatform.php
2)转到此函数initializeDoctrineTypeMappings()
3)没有简单地添加您的Map的条目,就像在我的情况下,我Map位与布尔如下:
“位”=〉“布尔值”,
4)重新加载你的应用程序,它就会工作。

qq24tv8q

qq24tv8q5#

我建议使用整数或位字符串(尽管这不允许对它进行位操作)。
下面是一个完整的例子:

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中,如下所示:

doctrine:
    dbal:
        # [...] other configs here
        types:
          bit: App\Type\BitType
        mapping_types:
          bit: bit

相关问题