如何克隆具有关系的实体?

时间:2014-04-30 11:26:01

标签: php symfony doctrine-orm entity

我需要克隆一个名为Projects的实体,其中包含2个实体关系调用ZoneSector。 我试图在控制器中使用类似的东西:

$new_project = clone $project;
$em = $this->getDoctrine()->getManager();
$em->persist($new_project);
$em->flush();

它适用于复制实体Projects,但它不会复制其他2个实体及其关系......

有什么建议吗?

编辑:我在question找到了一个快速简便的解决方案。谢谢!

2 个答案:

答案 0 :(得分:1)

我在运行此问题时所做的是编写一个函数,该函数动态读取对象的元数据,遍历它们,并手动复制每个字段。

元数据将具有一个名为“fieldNames”的属性,其中包含非关系字段,“associationMappings”具有关系字段。一个例子:

    $em = $this->getDoctrine()->getManager();
    $objectToClone = $em->getRepository('Xxx')->find(xx);
    $class = get_class($objectToClone);
    $metadata = $em->getMetadataFactory()->getMetadataFor($class);
    // Symfony\Component\PropertyAccess\PropertyAccessor;
    $accessor = new PropertyAccessor();
    $newObject = new Xxx();
    foreach ($metadata->getFieldNames() as $value) {
        if (property_exists($objectToClone, $value)) {
            $accessor->setValue($newObject, $value, $accessor->getValue($objectToClone, $value));
        }
    }
    foreach ($metadata->getAssociationMappings() as $key => $value) {
        if (property_exists($objectToClone, $key)) {
            $accessor->setValue($newObject, $key, $accessor->getValue($objectToClone, $key));
        }
    }

希望这有帮助。

答案 1 :(得分:0)

尝试此功能:

public static function cloneObject( $source ) {
    if ( $source === null ) {
        return null;
    }

    return unserialize( serialize( $source ) );
}

我用它来克隆zf2项目中的实体,它工作正常。它允许我从主实体迭代一对多的相关实体。