我可以为教义事件中的简单字段获取旧值:
preUpdate - $args->getEntityChangeSet()
或$args->getOldValue()
onFlush - $uow->getEntityChangeSet($entity)
但我不明白如何为协会(OneToMany,ManyToMany)做到这一点。更改集不包含它们。
有可能吗?
由于
答案 0 :(得分:0)
此类关联的反面变更集只是不包含这些条目。 因此,没有简单的方法来检索所有关联实体的初始状态。话虽这么说,如果您只是想访问相关实体的变更集,那么您几乎可以获得所需的一切。
在OneToMany关联的反面的实体侦听器的preUpdate
事件中,您可以执行以下操作:
public function preUpdate(Category $category, PreUpdateEventArgs $args)
{
$uow = $args->getEntityManager()->getUnitOfWork();
foreach($category->getElements() as $elt)
{
$eltChangeSet = $uow->getEntityChangeSet($elt);
// Do something with the retrieved info...
}
}
在此示例中,您还可以调用$category->getElements()->getDeleteDiff()
和$category->getElements()->getInsertDiff()
来检索已添加或移除到PersistentCollection的元素。但请注意,这两种方法都标记为INTERNAL,因此最好不要过多依赖它们。
由于您可以拥有关联实体的旧值,因此您可以尝试克隆它们并从那里重新创建它们之前的状态。主要缺点是您只能访问由Doctrine跟踪的字段上发生的更改,其他更改将丢失。
注意:由于更改集未考虑关联,因此如果仅关联的实体状态已更改,则不会触发反面的更新事件(它们各自的更改集将不为空但是反面将不会被通知)。