2012-05-31 4 views
0

merge()을 사용하여 행운이 없습니다.doctrine ODM (mongodb) 병합이 작동하지 않습니다.

/* @var $detachedDocument MyDocumentClass */ 
$detachedDocument = unserialize($serializedDocument); 
$document = $dm->merge($detachedDocument); 
$document->setLastUpdated(new \MongoDate()); 
$dm->persist($document); 

을하지만 변화는 스틱 결코 : 나는 거의 정확하게 what is documented하고 있어요.

$dm->createQueryBuilder('MyDocumentClass') 
    ->findAndUpdate() 
    ->field('lastUpdated')->set(new \MongoDate()) 
    ->getQuery() 
    ->execute(); 

merge()

은 매우 간단 보인다, 그래서 그것을해야한다고 생각처럼 작동하지 않는 이유는 혼란 스러워요 : 내가 대신이 작업을 수행 할 수 있습니다. 첫 번째 코드 예제에서

답변

3

merge()persist()가 중복 다음, 당신이 두 번째 예에서와 같이, 당신은 수동으로 쿼리를 실행하지 않는 한 실제로 (데이터베이스에 기록 할 수있는 유일한 작업입니다 flush()을 생략). UnitOfWork::doMerge()의 코드를 살펴보면 ID가없는 경우 객체를 유지하거나 ID로 문서를 가져 오는 것으로 나타납니다. 결과적으로 merge()은 관리되는 문서를 반환합니다. Persist는 호출 된 후에 문서가 관리되도록합니다 (아무 것도 반환하지 않습니다). UnitOfWork::doPersist()을 찌를 경우 관리 대상을 메서드에 전달하는 것이 실제로 NOOP임을 알 수 있습니다.

persist()flush()으로 바꾸어보십시오. 필요한 경우 단일 문서를 플러시 할 수 있지만 $dm->flush()은 기본적으로 모든 관리 객체를 처리합니다.

여전히 도움이되지 않으면 lastUpdated 필드가 ODM에 올바르게 매핑되어 있는지 확인해야합니다. 확인을 위해 $dm->getClassMetadata('MyDocumentClass')의 출력을 검사 할 수 있습니다. 매핑 된 필드가 아닌 경우 UnitOfWork는 문서에서 변경 사항을 감지하지 않으므로 플러시 할 내용이 없습니다.

제 2의 코드 예에서는 검색 기준없이 findAndUpdate()을 실행 중입니다 (set() 만 지정). 일반적으로 수정 사항을 equals() (아마도 케이스의 ID)과 같이 지정하면 단일 문서가 원자 적으로 수정되어 반환됩니다.

+0

이 멋진 답변에 감사드립니다! 가능하다면 두 번 upvote 것입니다. 마침내'flush()'와'merge()'를 이해합니다. 'equals()'에 대한 좋은 호칭. 나는 그것을 인위적인 예에 ​​포함시키는 것을 잊었다. –

관련 문제