克隆嵌入文档仅在值更改时才有效

时间:2014-04-09 09:31:02

标签: mongodb symfony doctrine-odm

我有一个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();

新文档已创建,但propertiesproperties.name不存在。 现在奇怪的是,如果我取消注释我修改$city_name的行,则使用修改后的值创建properties.name。 如果不是从$city_name获取$city_origin而是手动输入其值(作为字符串),则不会创建该属性。如果我在我的收藏中提供另一个City的名称,则没有问题。

理想情况下,我想用其嵌入的文档克隆整个文档:我该怎么做?

1 个答案:

答案 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

您需要在城市类中定义克隆功能并克隆您需要的所有对象。

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