繁体   English   中英

Symfony 3 / Doctrine - 获取实体更改集中关联的更改

[英]Symfony 3 / Doctrine - Get changes to associations in entity change set

所以我已经知道我可以在preUpdate生命周期事件中对特定实体进行更改:

/**
 * Captures pre-update events.
 * @param PreUpdateEventArgs $args
 */
 public function preUpdate(PreUpdateEventArgs $args)
 {
     $entity = $args->getEntity();


     if ($entity instanceof ParentEntity) {
            $changes = $args->getEntityChangeSet();
     }
 }

但是,有没有办法同时获得任何相关实体的更改? 例如,说ParentEntity的关系设置如下:

/**
 * @ORM\OneToMany(targetEntity="ChildEntity", mappedBy="parentEntity", cascade={"persist", "remove"})
 */
 private $childEntities;

ChildEntity也有:

/**
 * @ORM\OneToMany(targetEntity="GrandChildEntity", mappedBy="childEntity", cascade={"persist", "remove"})
 */
 private $grandChildEntities;

有没有办法在preUpdateParentEntity期间获得所有相关更改?

OneToMany或ManyToMany关系中的所有关联实体都显示为Doctrine \\ ORM \\ PersistentCollection

看一下PersistentCollection的API,它有一些有趣的公共方法,即使它们被标记为INTERNAL: https//github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/PersistentCollection.php#L308

例如,您可以检查您的集合是否为脏,这意味着其状态需要与数据库同步。 然后,您可以检索已从集合中删除或插入其中的实体。

if ($entity->getChildEntities()->isDirty()) {
    $removed = $entity->getChildEntities()->getDeleteDiff();
    $inserted = $entity->getChildEntities()->getInsertDiff();
}

您还可以在从数据库中获取集合时获取集合的快照: $entity->getChildEntities()->getSnapshot(); ,这用于创建上面的差异。

可能这不是最佳,但它可以完成这项工作。 您可以在ParentEntiy上添加带有时间戳的版本字段,然后在每个相关的实体设置器函数(Child或GranChild)上添加更新该父时间戳实体的行。 这样,每次调用setter时,都会对可以在侦听器处捕获的父实体进行更改。

我已经使用此解决方案来更新在子实体上发生更改时需要更新的ElasticSearch文档,并且它可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM