我有一个Mongo数据库,我通过Symfony中的以下文档类连接到它,使用Doctrine ODM(我只显示相关属性)。
/**
* @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;
}
我正在尝试在我的控制器中克隆City
,包括properties
,基本上是properties.name
。
为此,我使用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();
新文档已创建,但properties
和properties.name
不存在。
现在奇怪的是,如果我取消注释我修改$city_name
的行,则使用修改后的值创建properties.name
。
如果不是从$city_name
获取$city_origin
而是手动输入其值(作为字符串),则不会创建该属性。如果我在我的收藏中提供另一个City
的名称,则没有问题。
理想情况下,我想用其嵌入的文档克隆整个文档:我该怎么做?
答案 0 :(得分:0)
克隆对象时,您将获得此对象的副本,该副本与嵌入对象的引用相同。
当你这样做时:
$documentManager->detach($city_origin);
由于您的实体定义,Doctrine将分离与$ city_origin相关的所有对象:
cascade=DETACH or cascade=ALL
http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#detaching-entities
您需要在城市类中定义克隆功能并克隆您需要的所有对象。