我需要克隆一个名为Projects
的实体,其中包含2个实体关系调用Zone
和Sector
。
我试图在控制器中使用类似的东西:
$new_project = clone $project;
$em = $this->getDoctrine()->getManager();
$em->persist($new_project);
$em->flush();
它适用于复制实体Projects,但它不会复制其他2个实体及其关系......
有什么建议吗?
编辑:我在question找到了一个快速简便的解决方案。谢谢!
答案 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项目中的实体,它工作正常。它允许我从主实体迭代一对多的相关实体。