[英]Symfony 2 / Doctrine 2 : get changes to PersistentCollection
[英]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;
有没有办法在preUpdate
的ParentEntity
期间获得所有相关更改?
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.