gpt4 book ai didi

php - Symfony2 和 Doctrine : how to fetch two different object for the same id?

转载 作者:可可西里 更新时间:2023-11-01 13:24:36 26 4
gpt4 key购买 nike

我有这种情况:

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

等等。

在我的代码中,出于 tmp 的原因,我需要制作一个对象(比如 A)的“副本”(不,我不能使用不同的结构,我需要一个对象的副本)。

如果我使用clone,显然,我克隆了我的对象,但与他相关的对象没有被克隆。
我完全知道我可以覆盖魔术方法 __clone() 以便分配给 - 从对象的角度 - B、C、D 作为对象本身的克隆,但我有这么多对象(出于 Doctrine 的目的,它们中的许多都包含在 ArrayCollection 中)并且我宁愿避免重写每个对象的克隆函数。

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

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

其中 $aA 类的实例

完成此操作后 - 那当然是“错误的”,因为我怀疑学说会将该对象标记为“已提取”并返回其指针 ()* - 我只是打印了 ID我的两个对象都具有 spl_object_hash() 函数,当然,它们引用相同的对象 ID,因此引用相同的对象。

附言:

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

问题

我该如何应对这种情况?如您所见,我尝试了两种不同的方法,但没有一种让我满意。

注意事项

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

(*)

In this case the Article is accessed from the entity manager twice,but modified in between. Doctrine 2 realizes this and will only evergive you access to one instance of the Article with ID 1234, no matterhow often do you retrieve it from the EntityManager and even no matterwhat kind of Query method you are using (find, Repository Finder orDQL). This is called “Identity Map” pattern, which means Doctrinekeeps a map of each entity and ids that have been retrieved per PHPrequest and keeps returning you the same instances.

这证实了我之前所说的

最佳答案

答案没有我预期的那么复杂。

似乎调用 $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: Original Obj: 000000006523645c000000004b1160d1 [] [] [2013-02-08 12:07:20] app.DEBUG: Copied Obj: 00000000652366e3000000004b1160d1 [] []

关于php - Symfony2 和 Doctrine : how to fetch two different object for the same id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14770507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com