Symfony2和Doctrine:如何为同一个id获取两个不同的对象?

Don*_*sto 6 php symfony doctrine-orm symfony-2.1

我有这种情况:

  • 对象A对其他对象B,C,D有一些引用
  • 对象B对其他对象A,F,G有一些参考
  • 对象C有一些对其他对象的引用,...

等等.

在我的代码中,我需要为tmp原因制作一个对象(比如A)的"副本"(不,我不能使用不同的结构,我需要有一个对象的副本).

如果我使用clone,显然,我克隆了我的对象但是与他有关的对象,没有被克隆.
我完全知道我可以覆盖魔法__clone()来分配 - 从A对象的角度来看 - B,C,D作为对象本身的克隆,但我有很多对象(其中很多都包含在ArrayCollectionDoctrine中)目的)我宁愿避免覆盖每个对象的克隆功能.

或者,我认为我可以通过这种方式从教条中重新获取一个对象来创建一个新对象:

$aCopy = $this->entity_manager
                       ->getRepository('MyBundle:A')
                       ->find($a->getId());
Run Code Online (Sandbox Code Playgroud)

在哪里$a是一个实例class A

在执行此操作之后 - 当然这是"错误的"因为我怀疑doctrine会将该对象标记为"alredy fetched"并返回其指针()* - 我只是打印具有spl_object_hash()功能的两个对象的ID ,当然,它们引用相同的对象ID,因此对同一个对象.

PS:

我不能使用doctrine detach()函数,因为我需要在此操作后使原始对象可用

我该如何解决这种情况?正如你所看到的,我尝试了两种不同的方式,但没有一种方式让我感到满意.

注意

我也标记了php,因为如果有人能指出我不同的解决方案,基于php-pure,我也会考虑到它

(*)

在这种情况下,文章可以从实体管理器访问两次,但在两者之间进行修改.Doctrine 2实现了这一点,并且只会让您访问ID为1234的文章的一个实例,无论您多久从EntityManager中检索它,甚至无论您使用何种查询方法(find,Repository Finder或DQL).这称为"身份映射"模式,这意味着Doctrine会保留每个实体的映射以及每个PHP请求检索到的ID,并不断返回相同的实例.

这证实了我之前说过的话

Don*_*sto 3

答案没有我想象的那么复杂。

似乎足够的调用$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));
Run Code Online (Sandbox Code Playgroud)

这将打印

[2013-02-08 12:07:20] app.DEBUG:原始对象:000000006523 645c 000000004b1160d1 [] [] [2013-02-08 12:07:20] app.DEBUG:复制对象:000000006523 66e3 00 0000004b1160d1 [] []