首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Mysql中,规则不会持久化具有布尔值和PDO::ATTR_EMULATE_PREPARES = false的实体

在Mysql中,规则不会持久化具有布尔值和PDO::ATTR_EMULATE_PREPARES = false的实体
EN

Stack Overflow用户
提问于 2015-06-27 22:38:55
回答 2查看 1.9K关注 0票数 10

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

当使用Doctrine-DBAL时,整数值作为字符串返回到PHP,我们希望有整数值,特别是因为它们被还原为Javascript。在此讨论之后,我们已经安装了mysql本机驱动程序sudo apt-get install php5-mysqlnd,并将symfony (dbal)配置设置为PDO::ATTR_EMULATE_PREPARE = How to get numeric types from MySQL using PDO?

代码语言:javascript
运行
复制
doctrine:
    dbal:
         .
         .

         options:
            20 : false # PDO::ATTR_EMULATE_PREPARES is 20

有了这种配置,当mysql字段是整数时,我们就得到了整数。到目前一切尚好。

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

此外,我们没有得到任何错误或异常,所以我们发现这是非常危险的。我们认为PDO库中存在错误,但我们必须对其进行更深入的调查。

问题是:有没有人经历过这种行为?有什么解决方法吗?Doctrine应该解释这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2016-03-05 00:21:40

gseric的answer可以工作,但效果是用整数来补充实体的水分。要在实体中仍然使用布尔值,您可以简单地扩展Doctrine的BooleanType

代码语言:javascript
运行
复制
class BooleanToIntType extends \Doctrine\DBAL\Types\BooleanType
{
    public function getBindingType()
    {
        return \PDO::PARAM_INT;
    }
}

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

代码语言:javascript
运行
复制
\Doctrine\DBAL\Types\Type::overrideType('boolean', BooleanToIntType::class);
票数 8
EN

Stack Overflow用户

发布于 2016-02-18 17:53:33

如果对你来说还不算太晚,你可以通过以下方式在你的应用引导中修复这个问题:

代码语言:javascript
运行
复制
\Doctrine\DBAL\Types\Type::overrideType('boolean', 'Doctrine\\DBAL\\Types\\IntegerType');

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31089893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档