Doctrine不会使用布尔值持久化实体,并且在Mysql中PDO :: ATTR_EMULATE_PREPARES = false

Dmt*_*Dmt 9 php mysql pdo symfony doctrine-orm

我们正在使用Symfony来创建一些Web服务.我们使用Doctrine-ORM来存储实体,使用Doctrine-DBAL来检索数据,因为它非常轻,可以重用ORM(实体管理器)连接.

使用Doctrine-DBAL时,整数值作为字符串返回给PHP,我们希望有整数值,特别是因为它们被退回到Javascript.下面讨论如何使用PDO从MySQL获取数值类型?我们安装了mysql本机驱动程序sudo apt-get install php5-mysqlnd并使用PDO :: ATTR_EMULATE_PREPARE = false设置我们的symfony(dbal)配置:

doctrine:
    dbal:
         .
         .

         options:
            20 : false # PDO::ATTR_EMULATE_PREPARES is 20
Run Code Online (Sandbox Code Playgroud)

使用这种配置,当mysql字段是整数时,我们得到整数.到现在为止还挺好.

但是有一个新问题:当通过Doctrine-ORM存储具有布尔值的实体时,实体不会被持久化.我们在日志中看到INSERT和COMMIT,但记录不在数据库中(如果我们使用的表没有在实体中定义的布尔字段,则存储记录).

此外,我们没有得到任何错误或异常,因此我们发现这非常危险.我们认为PDO库中存在一个错误,但我们必须更多地了解它.

问题:有没有人经历过这种行为?任何解决方法?Doctrine应该解释这个吗?

web*_*ave 7

gseric的答案可行,但具有用整数保湿实体的效果.要在你的实体中获得布尔值,你可以简单地扩展Doctrine BooleanType:

class BooleanToIntType extends \Doctrine\DBAL\Types\BooleanType
{
    public function getBindingType()
    {
        return \PDO::PARAM_INT;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的应用程序引导程序中:

\Doctrine\DBAL\Types\Type::overrideType('boolean', BooleanToIntType::class);
Run Code Online (Sandbox Code Playgroud)


gse*_*ric 4

如果对您来说还不算太晚,您可以通过以下方式在应用程序引导程序中解决此问题:

\Doctrine\DBAL\Types\Type::overrideType('boolean', 'Doctrine\\DBAL\\Types\\IntegerType');
Run Code Online (Sandbox Code Playgroud)

执行此行后,Doctrine DBAL 会将 PHP 布尔值映射到 PDO 整数(PDO::PARAM_INT 而不是 od PDO::PARAM_BOOL)。

  • +1 但是,这将具有使用整数而不是布尔值来水合实体的效果。请参阅我的答案来解决这个问题。 (2认同)