【问题标题】:How to clone an entity whit relations?如何克隆具有关系的实体?
【发布时间】:2014-06-16 16:50:04
【问题描述】:

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

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

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

有什么建议吗?

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

【问题讨论】:

  • 查看question
  • 我试过了,但是没用。结果是一样的。

标签: php symfony doctrine-orm entity


【解决方案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));
        }
    }

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    试试这个功能:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-09
      • 2016-05-11
      • 1970-01-01
      • 2018-10-04
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多