2017-12-08 11 views
0

特定のフィールドが更新されたときに特定の処理を行いたい。多対多の関係を更新する方法を警告する方法はありますか?

イベントpreUpdateを使用してこれを実行し、更新されるフィールドを確認するのが当然の方法です。それは正常に動作します...多対多のフィールドを除いて。イベントをトリガーしますが、ChangeSetは空です。

/** 
* @ORM\PreUpdate 
*/ 
public function updateDate(PreUpdateEventArgs $event){ 
    $changeSet = $event->getEntityChangeSet(); 
    $res = ""; 
    foreach($changeSet as $key => $change){ 
     $line = $key." : ".$event->getOldValue($key)." || ".$event->getNewValue($key); 
     $res .= $line; 
    } 
} 

$ resでは、すべてのフィールドが多対多フィールドを除いて変更されています。

また、私はリスナーでそれをやろうとしていますが、エンティティマネージャから更新されたフィールドを抽出する方法が見つかりません。

ありがとうございます。

詳細情報:更新エンティティから

関係:

/** 
* @var Status 
* 
* @ORM\ManyToMany(targetEntity="User", inversedBy="projectsSupervisor", cascade={"persist"}) 
* @ORM\JoinTable(name="projects_supervisors") 
*/ 
protected $supervisors; 

反対側から:

/** 
* @var Project 
* 
* @ORM\ManyToMany(targetEntity="Task", mappedBy="users") 
*/ 
protected *tasks 

symfonyのバージョン:3.1.10

答えて

1

それは不可能です多対多関連に加えられた変更を追跡します。 here

アソシエーションの逆側に行った変更は無視されます。 は、さらに、(ビューの教義の視点から、あるいは 少なくとも所有側)

を双方向関連の両側を更新することを確認します:: getEntityChangeSet()通常のフィールドでない団体に対してのみ有効です。 1対多の関連付けのために、あなたは$unitOfWork->getScheduledCollectionUpdates()を使用することができます。

foreach ($uow->getScheduledCollectionUpdates() as $collectionUpdate) { 
    /** @var $collectionUpdate \Doctrine\ORM\PersistentCollection */ 
    if ($collectionUpdate->getOwner() === $entity) { 
     // This entity has an association mapping which contains updates. 
     $collectionMapping = $collectionUpdate->getMapping(); 
     print_r($collectionMapping); // Investigate this further 
    } 
} 

実用的な例は、exactly the same(ラインを196+)し、私のGitHubリポジトリ「DoctrineWatcher」で閲覧可能です。

関連する問題