2017-12-08 3 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에서 모든 필드는 다 대다 필드를 제외하고 수정됩니다.

또한 리스너에서 처리하려고 시도하지만 entityManager에서 업데이트 된 필드를 추출하는 방법을 찾을 수 없습니다.

감사합니다.

추가 정보 : 업데이트 엔티티로부터

관계 :

/** 
* @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 

심포니 버전 : 3.1.10

답변

1

그것은 불가능 다 대다 협회에 대한 변경 사항을 추적합니다. here :

연관의 반대쪽에만 변경된 사항은 무시됩니다. 또한

(보기의 교리의 관점에서, 또는 이상 소유 측) 양방향 연관의 양쪽을 업데이트해야합니다 :: getEntityChangeSet()는 일반 필드가 아닌 단체에만 유용합니다. 일대-협회의 경우 $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"에서 볼 수 있습니다.

관련 문제