-->

Symfony2中和之道:如何为同一个ID中取出两个不同的对象?(Symfony2 and Doct

2019-07-19 14:37发布

我有这样的场景:

  • 对象A有一定的参考其他对象的B,C,d
  • 对象B有一些参考其他对象A,F,G
  • 对象C具有一定的参考其他对象的,...

等等。

在我的代码,我需要做出的TMP的原因(不,我不能使用不同的结构,我需要有对象的副本)的对象(比如A)的“副本”。

如果我使用clone ,很明显,我做我的对象,但与他有关对象的克隆,不是克隆。
我perfeclty知道我可以重写魔方法__clone()以便分配给-从一个目标点- B,C,d为对象的克隆本身,而是我有这么多的对象(和其中许多载到ArrayCollection教义目的),我宁愿避免每个对象的clone功能的覆盖。

另外,我认为我可以从教义重新获取一个目的是使一个新的,以这种方式:

$aCopy = $this->entity_manager
                       ->getRepository('MyBundle:A')
                       ->find($a->getId());

其中$a是实例class A

在执行此操作之后- 这当然是“错误的”,因为我怀疑主义将标志着该对象为“alredy牵强”,并返回其指针()* -我简单地打印我的两个对象与ID spl_object_hash()函数,当然再次,它们指的是相同的对象ID,所以对相同的对象。

PS:

我不能使用学说detach()函数,因为我需要提供原始对象此操作后

我怎样才能解决这种情况呢? 正如你所看到的,我tryied两种不同的方式,并没有她们其中一人能让我满意。

注意

我标记PHP也,因为如果有人可以点我到一个不同的解决方案,PHP的基于纯,我会考虑到这一点也

(*)

在这种情况下,第二条是从实体管理器访问两次,但在两者之间进行修改。 原则2实现这一点,将只给你访问的第一个实例ID为1234,不管你是否经常从EntityManager的检索,甚至不管你用的是什么样的查询方法(查找,资源库Finder或DQL)。 这就是所谓的“标识映射”的格局,这意味着主义保持地图已经每PHP请求检索每个实体和ID,并保持你返回相同的实例。

这证实了我以前说

Answer 1:

答案是比我预想的那么复杂。

这似乎是sufficent调用$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年2月8日12点07分20秒] app.DEBUG:原始的OBJ:000000006523 645C 000000004b1160d1 [] [] [2013年2月8日12点07分20秒] app.DEBUG:复制的OBJ:000000006523 66e3 000000004b1160d1 [] []



Answer 2:

所以,据我所知,这是不支持D2行为开箱即用,所以我会说你需要自己实现克隆操作。

话虽如此,我也不能100%肯定,如果你序列化会发生什么,然后反序列化一个D2实体,这可能会做你想做的(尽管在一个相当不愉快的方式)。 此外,你可以 ,最初获取的实体后,取下你立即得到什么,如果查询的使用结果缓存已传播的原始实例点以外的“活动”的副本中的任何引用,然后再重新获取结果(这不应该承载太多的罚款的)。 据推测,这不会是一个巨大的问题,但是,因为你只是拷贝工作暂时。

WRT来清除实体管理器,它会卸下所有被管理实体,这很可能有不良的副作用。

HTH。



文章来源: Symfony2 and Doctrine: how to fetch two different object for the same id?