簡體   English   中英

Symfony 2 / Doctrine 2:對PersistentCollection進行更改

[英]Symfony 2 / Doctrine 2 : get changes to PersistentCollection

我正在構建一個應用程序,用戶可以在其中編輯一些數據,然后呈現一個屏幕,他可以在其中確認(並評論)他的編輯。

在確認表單中,我顯示了對實體所做的更改。 這適用於“普通”字段。 以下是一些用於檢查單個字段的代碼:

// create $form
// bind $form

if ($form->isValid() {
    $data = $form->getData();
    // example, get changes of a "normal" field
    if ($data['color'] != $entity->getColor()) {
        // do something with changes
    }
}

但我不能對關系做同樣的事情(例如ManyToMany with Users):

    if ($data['users'] != $entity->getUsers()

因為$ data ['users']和$ entity-> getUsers()引用相同的持久集合,所以不起作用。 可以調用此函數來查看是否有更改:

    if ($data['users']->isDirty())

但是不可能看到做了哪些改變。

上面的第二個問題是,如果從持久集合中刪除所有項目,則Doctrine不會將其標記為“已更改”(isDirty()= true),因此我無法捕獲用戶刪除所有內容的具體更改“用戶“來自表單中的實體。

請注意,代碼全部有效,我唯一的問題是我無法查看/處理在確認步驟中所做的更改。

Doctrine\\ORM\\PersistentCollection具有內部API(公共)方法getSnapshotgetDeleteDiffgetInsertDiff ,可以在Doctrine\\ORM\\UnitOfWork生命周期事件中使用。 例如,您可以在onFlush期間檢查持久集合的插入差異。

解決它像這樣:

1)要獲得將直接對實體進行的更改,請使用以下命令:

// create form
// bind form
// form isValid()

$uow = $em->getUnitOfWork();
$uow->computeChangeSets();
$changeset = $uow->getEntityChangeSet($entity);
print_r($changeset);

2a)要更改關系,請使用上面Lighthart的答案:

$oldUsers = $entity->getUsers()->toArray();
// bind form
// form isValid
$newUsers = $entity->getUsers()->toArray();
// compare $oldUsers and $newUsers

2b)在Persistent Collection上使用這些方法來查找插入/刪除:

$newUsers = $entity->getUsers();
$inserted = $newUsers->getDeleteDiff();
$deleted  = $newUsers->getInsertDiff();

(2b)的唯一問題是如果刪除了所有用戶而沒有添加任何用戶,則getDeleteDiff()為空,這似乎是一個Doctrine bug / idiosyncrasy

在綁定之前將原始集合存儲在變量中,然后在綁定之后比較新集合。 PHP有很多數組比較函數,並且集合很容易通過$ collection-> toArray()轉換為本機數組;

例如:

// create form
$oldusers=$entity->getUsers()->toArray();
// bind form
if ($form->isValid() {
    $data = $form->getData();
    if ($data['users'] != $oldusers) {
        // do something with changes
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM