当十进制列映射到类型提示浮点数 属性 时,即使未更改,学说也会更新字段

When a decimal column is mapped to a typehinted float property, doctrine updates a field even if not changed

我有一个用户 class,字段为

/**
 * @ORM\Column(type="decimal", precision=12, scale=6)
 */
private float $credit = 0;

或使用 php8,相同的行为:

private int|float $credit = 0;

如果我加载一个用户,即使不做任何更改,在下一次 flush() 时,学说将发送一个查询来更新其信用:

(这是非常危险的,因为演职员表可能同时被另一个脚本更改,从而恢复更改。演职员表不应该直接从应用程序编辑,甚至没有 setCredit( ) 方法... )

通过在 preUpdate() 方法中添加一些转储,我发现该值已更改为:

"-10746.000000"(字符串)

收件人:

-10746.000000(浮动)

如果我删除私​​有 属性:

上的类型提示,则不会发生这种情况
private $credit = 0; // Working, credit is not updated to db 

为什么会这样?我是做错了什么还是应该将其报告为错误?

对于 decimal 字段,Doctrine 将检索数据作为 stringnull。这在文档中有解释,here.

由于您将 属性 定义为 float,因此您在检索数据时强制 Doctrine 进行某种类型的处理,这反过来又导致实体混淆 'dirty':从 DB 检索的值 等于存储在 属性 上的值,例如'123.12' !== 123.12.

您应该为 decimal 个属性使用 string 类型。

然后你要么在你想执行数学运算时转换为 float,要么在你对精度感兴趣时使用 BC Math 之类的东西(使用 a 时通常是这种情况) decimal 类型)。