Symfony / Doctrine检测到" money"字段,即使没有发生变化?

时间:2015-11-18 06:19:11

标签: symfony doctrine-orm

我有一个"实体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
  ]
]

显然是一个类型转换问题,但我该如何防止这种情况?我是否真的必须检查变更集中的每个属性并确认它实际发生了变化?

我也尝试过"数字"表单类型具有相同的结果。

1 个答案:

答案 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);
        }