【问题标题】:How to clone an entity whit relations?如何克隆具有关系的实体?
【发布时间】:2014-06-16 16:50:04
【问题描述】:
我需要克隆一个名为Projects 的实体,其中包含两个实体关系调用Zone 和Sector。
我试图在控制器中使用类似的东西:
$new_project = clone $project;
$em = $this->getDoctrine()->getManager();
$em->persist($new_project);
$em->flush();
它适用于复制实体项目,但它不复制其他 2 个实体及其关系...
有什么建议吗?
编辑:我在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 项目中的实体,它工作正常。它允许我从主实体迭代一对多相关实体。