我们正在使用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应该考虑到这个吗?
答案 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)。