2011-07-27 5 views
2

Doctrine 1.x에는 $ entity-> isModified() 메소드가 있었는데, 이것은 매우 유용했습니다. 누구든지 Doctrine 2.x에서이 기능을 복제하는 방법을 찾았습니까?Doctrine 2.x - isModified 해당 항목이 있습니까?

UnitOfWork를 검색하고 문제의 엔터티에 대한 변경 사항을 계산 한 다음 해당 엔터티가 변경 대기열에 있는지 여부를 묻는 질문과 같은 몇 가지 방법을 살펴 보았습니다. M2M 관계와 같은 부작용이 두 번 삽입되어 데이터베이스 제약 조건 예외가 발생합니다. 나는 그것이 "의도 된 사용법"이 아니라는 것을 의미합니다!

Doctrine이 이미 트랙을 유지하고있을 때 다른 방법을 통해 변경 사항을 추적하는 것은 작업의 거대한 복제처럼 보입니다. 그래서 나는 방법이 있기를 바랍니다.

답변

1

두 번 삽입하는 방법을 이해하기 위해 몇 가지 코드를보고 싶습니다. 또한, 왜 이것을하고 싶습니까?

어쨌든 tracking policy을 변경할 수 있습니다. 알림 정책을 찾는 것과 같습니다.

그렇지 않은 경우 언제든지 pre-update 특수 효과를 사용할 수 있습니다.

어소시에이션에서 persist/all cascade을 사용하지 말 것을 권한다. 그러면 예외가 발생하고 먼저 연결을 유지해야합니다. 이중 지속 문제로 디버깅하는 데 도움이 될 수도 있습니다.

+0

감사를 게시는 - 몇 자세한 내용은 우리는 생각하기 시작하고 :) 추가 게시물을 업데이트 한 그 라인을 따라 뭔가 알림 추적 정책에 제안 된 내용 중 일부는 앞으로 갈 길입니다. – Mark

0

Doctrine 1.x 기반 CMS에서 일반적으로 문제의 엔터티를 가져 와서 데이터로 채운 다음 $ entity-> isModified()를 묻습니다. (그리고하지 않으면 것은, 우리는 사용자에게 피드백을 보낼 수 있습니다 - "아니오 변경")

코드 - 지혜의 isModified() 교체과 같이이다 :

public function isModified($entity) { 
    $metadata = $this->em->getClassMetadata(get_class($entity)); 
    $uow = $this->em->getUnitOfWork(); 

    $uow->computeChangeSet($metadata, $entity); 
    return $uow->isEntityScheduled($entity); 
} 

불행하게도, 우리는 M2M 추가 한 경우 관계를 유지하게되면 Doctrine이 uow-> computeChangeSets()를 호출하여 M2M 삽입이 두 번 대기하게되므로 아마도 지속될 때 M2M이 두 번 추가됩니다.

우리는 알림 추적 정책에서 제안 된 것과 유사한 작업을 수행했습니다. 기본적으로 모든 설정자를 연결합니다.

참고이 답변은 OP 마크가 질문에