![](/img/trans.png)
[英]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.