我们正在使用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?:
doctrine:
dbal:
.
.
options:
20 : false # PDO::ATTR_EMULATE_PREPARES is 20有了这种配置,当mysql字段是整数时,我们就得到了整数。到目前一切尚好。
但是有一个新的问题:当通过Doctrine-ORM存储带有布尔值的实体时,该实体不是持久的。我们在日志中看到INSERT和COMMIT,但是记录不在数据库中(如果我们使用一个没有在实体中定义布尔值字段的表,则存储该记录)。
此外,我们没有得到任何错误或异常,所以我们发现这是非常危险的。我们认为PDO库中存在错误,但我们必须对其进行更深入的调查。
问题是:有没有人经历过这种行为?有什么解决方法吗?Doctrine应该解释这一点吗?
发布于 2016-03-05 00:21:40
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);发布于 2016-02-18 17:53:33
如果对你来说还不算太晚,你可以通过以下方式在你的应用引导中修复这个问题:
\Doctrine\DBAL\Types\Type::overrideType('boolean', 'Doctrine\\DBAL\\Types\\IntegerType');执行此行之后,Doctrine DBAL会将PHP布尔值映射到PDO::PARAM_BOOL整数(PDO::PARAM_INT而不是PDO )。
https://stackoverflow.com/questions/31089893
复制相似问题