Doctrine并没有使用布尔值来保持实体,并且在Mysql中PDO :: ATTR_EMULATE_PREPARES = false

时间:2015-06-27 14:38:55

标签: php mysql symfony pdo doctrine-orm

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

使用Doctrine-DBAL时,整数值作为字符串返回给PHP,我们希望得到整数值,特别是因为它们被退回到Javascript。在讨论How to get numeric types from MySQL using PDO?之后,我们安装了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

使用这种配置,当mysql字段是整数时,我们得到整数。到目前为止一切都很好。

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

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

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

2 个答案:

答案 0 :(得分:7)

gseric的answer会起作用,但会产生用整数保湿实体的效果。要在你的实体中获得布尔值,你可以简单地扩展Doctrine的BooleanType

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

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

\Doctrine\DBAL\Types\Type::overrideType('boolean', BooleanToIntType::class);

答案 1 :(得分:4)

如果对您而言为时已晚,您可以通过以下方式解决此问题:

\Doctrine\DBAL\Types\Type::overrideType('boolean', 'Doctrine\\DBAL\\Types\\IntegerType');

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