2014-04-09 2 views
0

나는 Symfony의 다음 문서 클래스를 통해 Doctrine ODM (관련 속성 만 표시하고 있음)을 사용하여 연결된 Mongo 데이터베이스를 보유하고 있습니다. 값이 변경되면 임베디드 문서 복제 만 가능합니다.

/** 
* @MongoDB\Document 
* @MongoDB\InheritanceType("COLLECTION_PER_CLASS") 
*/ 
class Feature { 
    /** @MongoDB\EmbedOne(targetDocument="FeatureProperties") */ 
    protected $properties; 
} 

/** @MongoDB\Document */ 
class City extends Feature {} 

/** @MongoDB\EmbeddedDocument */ 
class FeatureProperties { 
    /** @MongoDB\String */ 
    protected $name; 
} 

나는 본질적 properties, properties.name의 포함, 내 컨트롤러에 City를 복제하는 것을 시도하고있다.

이 작업을 수행하려면 QueryBuilder를 사용하여 도시를 가져 와서 $city_origin이라고 부릅니다. 그런 다음, 여기에 내가 그것을 복제 방법은 다음과 같습니다

$new_city = clone $city_origin; 
$city_name = $city_origin->getProperties()->getName(); 
// $city_name .= ' '; 
$documentManager->detach($city_origin); 
$new_city->setId('_' . $city_origin->getId()); 
$new_city->getProperties()->setName($city_name); 
$documentManager->persist($new_city); 
$documentManager->flush(); 
새 문서가 만들어

하지만 propertiesproperties.name 존재하지 않습니다. 이상한 점은 $city_name을 수정 한 행의 주석을 지우면 수정 된 값으로 properties.name이 생성된다는 것입니다. $city_name$city_origin에서 가져 오는 대신 수동으로 값을 입력하면 (문자열로) 속성도 생성되지 않습니다. 내 컬렉션에 다른 City의 이름을 지정하면 문제가 없습니다.

전체 문서를 포함 된 문서로 복제하는 것이 이상적입니다. 어떻게 할 수 있습니까?

답변

0

개체를 복제 할 때이 개체의 복사본을 포함 된 개체의 동일한 참조로 가져옵니다.

당신이 할 경우 :

$documentManager->detach($city_origin); 
교리 때문에 엔터티 정의의 $ city_origin 관련된 모든 객체를 분리합니다

:

cascade=DETACH or cascade=ALL 

http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#detaching-entities

당신은 복제 기능을 정의 할 필요가 도시 교실에 가서 필요한 모든 물건을 복제하십시오.

http://www.php.net/manual/en/language.oop5.cloning.php