簡體   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