【问题标题】:Symfony2 Doctrine mergeSymfony2 学说合并
【发布时间】:2013-03-27 20:26:07
【问题描述】:

我正在研究https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-associations.html,但我无法弄清楚级联合并的作用。我在其他地方看到过

$new_object = $em->merge($object); 

基本上基于$object创建一个新的托管对象。对吗?

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    $em->merge() 用于获取已从实体管理器的上下文中取出的实体并“重新附加它”。

    • 如果实体从未被管理,则合并等同于持久化。
    • 如果实体已分离或序列化(可能放在缓存中),则合并或多或少会在数据存储中查找实体的 ID,然后开始跟踪从该点开始对实体的任何更改。李>

    级联合并将此行为扩展到您要合并的实体的关联实体。这意味着更改会级联到关联,而不仅仅是合并的实体。

    【讨论】:

    • 非常感谢您!我也遇到了类似的问题,实体管理器关闭后我不得不重置管理器。发生的事情是应该更新的实体,得到插入语句,当然出现了外键约束错误。使用 $em->merge() 为我解决了这个问题,因为它再次将实体标记为托管。
    • 我知道这个答案是旧的,但仅供参考,merge() 将在 Doctrine3 github.com/doctrine/doctrine2/blob/master/UPGRADE.md 中删除
    • 当我使用 JMS 序列化程序将 JSON 转换为具有关系的实体并且我得到级联合并时,我现在将它与 FOS REST 包一起使用。如果我不使用合并,则级联将被忽略,因为它使用反射,并且设置器未正确设置以使 ref Id 从子表到父表。不知道有没有比使用 Merge 更好的解决方案?
    • 从缓存中获取实体后,我使用合并来持久化它。但是,如果要弃用,替换是什么?
    • 好吧,我也在从缓存中构建一个实体,并将其作为另一个实体的关系传递,并且随着级联持续存在,它试图在 DB 中创建一个新条目,而不是仅仅关联它。此外,如果我只是对实体进行持久化,它也会尝试创建新的数据库条目。所以看起来在我的情况下坚持忽略 id 存在并尝试将记录插入数据库的事实,不知道为什么我可能正在使用 UUID?它仅在我进行合并时对我有用。级联合并也不起作用。
    【解决方案2】:

    我知道这是一个老问题,但我认为值得一提的是 $em->merge() 已被弃用,很快就会被删除。 Check here

    合并操作已被弃用,并将在 Persistence 2.0 中删除。 合并应该是应用程序业务领域的一部分,而不是 而不是 ObjectManager 的通用操作。

    另请阅读此文档 v3 他们期望实体如何存储

    https://www.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/entities-in-session.html#entities-in-the-session

    最好避免以序列化格式存储实体,例如 作为 $_SESSION:存储实体标识符或原始数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2012-03-11
      • 1970-01-01
      • 2015-07-03
      相关资源
      最近更新 更多