如何获得实体关联的旧价值?

时间:2017-10-23 08:26:13

标签: php symfony doctrine-orm doctrine

我可以为教义事件中的简单字段获取旧值:
preUpdate - $args->getEntityChangeSet()$args->getOldValue()
onFlush - $uow->getEntityChangeSet($entity)

但我不明白如何为协会(OneToMany,ManyToMany)做到这一点。更改集不包含它们。

有可能吗?

由于

1 个答案:

答案 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跟踪的字段上发生的更改,其他更改将丢失。

注意:由于更改集未考虑关联,因此如果仅关联的实体状态已更改,则不会触发反面的更新事件(它们各自的更改集将不为空但是反面将不会被通知)。