我有这样的场景:
- 对象 A 对其他对象 B、C、D 有一些引用
- 对象 B 对其他对象 A、F、G 有一些引用
- 对象 C 对其他对象 A 有一些引用,...
等等。
在我的代码中,出于临时原因,我需要制作一个对象(比如A)的“副本”(不,我不能使用不同的结构,我需要有一个对象的副本)。
如果我使用clone
显然,我克隆了我的对象,但与他相关的对象没有被克隆。
我完全知道我可以覆盖 magic-method__clone()
为了分配给 - 从 A 对象的角度来看 - B、C、D 作为对象本身的克隆,但我有很多对象(其中许多对象包含在ArrayCollection
出于原则目的),我宁愿避免覆盖每个对象的克隆函数。
或者,我认为我可以从学说中重新获取一个对象来创建一个新对象,这样:
$aCopy = $this->entity_manager
->getRepository('MyBundle:A')
->find($a->getId());
where $a
是一个实例class A
完成此操作后 -这当然是“错误的”,因为我怀疑该学说会将该对象标记为“已获取”并返回其指针()* - 我只是打印我的两个对象的 IDspl_object_hash()
函数,当然,它们引用相同的对象 ID,因此引用相同的对象。
PS.:
我无法运用教义detach()
函数,因为我需要在此操作后获得可用的原始对象
Question
我该如何应对这种情况?正如你所看到的,我尝试了两种不同的方法,但没有一种让我满意。
Note
我也标记了 php,因为如果有人可以向我指出一个不同的解决方案,基于 php-pure,我也会考虑它
(*)
在这种情况下,从实体管理器访问文章两次,
但在其间进行了修改。教义 2 认识到这一点,并且只会永远
使您能够访问 ID 为 1234 的文章的一个实例,无论
您多久从 EntityManager 检索一次它,甚至无论
您正在使用哪种查询方法(查找、存储库查找器或
DQL)。这称为“身份地图”模式,意思是 Doctrine
保存每个 PHP 检索到的实体和 ID 的映射
请求并不断返回相同的实例。
这证实了我之前所说的
答案没有我想象的那么复杂。
看来打电话就足够了$this->entity_manager->clear();
这将清除该实体映射并强制其从数据库重新加载到一个全新的对象中!
$this->entity_manager->clear();
$aCopy = $this->entity_manager
->getRepository('MyBundle:A')
->find($a->getId());
$this->logger->debug('Original Obj: '.spl_object_hash($a));
$this->logger->debug('Copied Obj: '.spl_object_hash($aCopy));
这将打印
[2013-02-08 12:07:20] app.DEBUG:原始对象:
000000006523645c000000004b1160d1[][][2013-02-08 12:07:20]
app.DEBUG:复制的对象:00000000652366e3000000004b1160d1 [] []
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)