我有一个"实体A"我的表格上的记录。 "实体A"的一个属性如下:
/**
* @var float
*
* @ORM\Column(name="amount", type="decimal", precision=65, scale=2, nullable=true)
*/
private $amount;
当我提交包含表单时,Doctrine会为每个"实体A"触发preUpdate事件。集合中的对象,即使绝对没有任何变化。变更集如下所示:
array:1 [▼
"amount" => array:2 [▼
0 => "5.00"
1 => 5.0
]
]
显然是一个类型转换问题,但我该如何防止这种情况?我是否真的必须检查变更集中的每个属性并确认它实际发生了变化?
我也尝试过"数字"表单类型具有相同的结果。
答案 0 :(得分:0)
我认为preUpdate没有问题。它假设以这种方式工作。
如果你看一下代码,那么在评估变更集之前,preUpdate
会被调用。
UnitOfWork.php第1063 - 1070行
private function executeUpdates($class)
{
// .........
if ($preUpdateInvoke != ListenersInvoker::INVOKE_NONE) {
$this->listenersInvoker->invoke($class, Events::preUpdate, $entity, new PreUpdateEventArgs($entity, $this->em, $this->entityChangeSets[$oid]), $preUpdateInvoke);
$this->recomputeSingleEntityChangeSet($class, $entity);
}
if ( ! empty($this->entityChangeSets[$oid])) {
$persister->update($entity);
}
//.........
}
同时,变更集不正确的问题仍然存在。我没有看到任何其他方法来修复它,而不是在它到达实体之前过滤表单中的值。这是另一个问题......
这是代码ho UOW决定实体的变化。它是!==
if ($orgValue !== $actualValue) {
$changeSet[$propName] = array($orgValue, $actualValue);
}