学说没有;t在Mysql中持久化具有布尔值和PDO::ATTR_EMULATE_REPREPARES=false的实体


Doctrine doesn't persist entity with boolean values and PDO::ATTR_EMULATE_PREPARES = false in Mysql

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

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

doctrine:
    dbal:
         .
         .
         options:
            20 : false # PDO::ATTR_EMULATE_PREPARES is 20

使用此配置,当mysql字段为整数时,我们将获得整数。到目前为止还不错。

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

此外,我们没有得到任何错误或异常,所以我们发现这非常危险。我们认为PDO库中有一个错误,但我们必须深入研究。

问题是:有人经历过这种行为吗?有什么变通办法吗?教义应该解释这一点吗?

gseric的答案会起作用,但效果是用整数水合实体。为了在你的实体中仍然得到布尔值,你可以简单地扩展条令的BooleanType:

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

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

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

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

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

执行这一行之后,Doctrine DBAL将把你的PHP布尔值映射到PDO整数(PDO::PARAM_INT而不是od-PDO::PARA_BOOL)。