6

ユーザーが一部のデータを編集できるアプリケーションを構築しており、編集内容を確認 (およびコメント) できる画面が表示されます。

確認フォームに、エンティティに加えられた変更を表示します。これは「通常の」フィールドで機能します。単一のフィールドをチェックするために機能するコードを次に示します。

// 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())

しかし、どのような変更が行われたかを確認することはできません。

上記の 2 つ目の問題は、すべてのアイテムが永続コレクションから削除された場合、Doctrine はそれを「変更済み」としてマークしない (isDirty() = true) ため、ユーザーがすべてを削除した特定の変更をキャッチできないことです。 users」をフォームのエンティティから取得します。

コードはすべて機能することに注意してください。唯一の問題は、確認ステップで行われた変更を表示/処理できないことです。

4

3 に答える 3

6

次のように解決しました:

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) 永続コレクションでこれらのメソッドを使用して、挿入/削除を見つけます。

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

(2b) の唯一の問題は、すべてのユーザーが削除され、追加されたユーザーがいない場合、getDeleteDiff() が空であり、Doctrine のバグ/特異性のように見えることです。

于 2013-02-15T17:30:56.090 に答える
6

Doctrine\ORM\PersistentCollectiongetSnapshotには、のライフサイクル イベント中getDeleteDiffgetInsertDiff使用できる内部 API (公開) メソッドがありDoctrine\ORM\UnitOfWorkます。たとえば、実行中に永続コレクションの挿入差分を確認できonFlushます。

于 2013-02-14T01:38:10.840 に答える
0

バインド前に元のコレクションを変数に格納し、バインド後に新しいコレクションを比較します。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
    }
}
于 2013-02-15T04:55:38.283 に答える