gpt4 book ai didi

symfony - 如何在 Doctrine 3 中替换 EntityManager::merge?

转载 作者:行者123 更新时间:2023-12-04 11:11:53 26 4
gpt4 key购买 nike

我在工作 Symfony 2.8当前使用的基于 Web 应用程序项目 Doctrine 2 .该项目基本上是一个简单的待办事项列表应用程序,可以与移动应用程序(iOS/Android)同步。

在阅读 Doctrine 3 的更新说明时我发现,EntityManager::merge will no longer be supported .

An alternative to EntityManager#merge() is not provided by ORM 3.0, since the merging semantics should be part of the business domain rather than the persistence domain of an application. If your application relies heavily on CRUD-alike interactions and/or PATCH restful operations, you should look at alternatives such as JMSSerializer.



我不确定更换 EntityManager::merge 的最佳/正确方法是什么?

我在哪里使用合并:

在移动应用程序与 Web 应用程序同步期间,数据作为序列化 JSON 传输,然后由 JMSSerializer 反序列化。到实体对象。当 Web 应用程序收到 ToDoEntry对象,它可以是一个新的 ToDo-Entry(在 Web 应用程序中还不知道)或更新的现有条目。无论哪种方式,接收到的对象都不是由 EntityManager 管理的。 .因此 $em->persist($receivedObject)将始终尝试插入新对象。如果 Web 应用程序中已经存在 ToDo-Entry 并且需要更新,这将失败(由于 id 的唯一约束)。

而是 $em->merge($receivedObject)用于自动检查是否需要插入或更新。

热窝解决这个问题?

当然,如果已经存在具有相同 ID 的实体,我可以检查每个接收到的对象。在这种情况下,可以加载现有对象并手动更新其属性。然而,这将是非常麻烦的。真正的项目当然使用许多不同的实体,每个实体类型/类都需要自己的处理来检查哪些属性需要更新。没有更好的解决办法吗?

最佳答案

您可以尝试使用 Doctrine\ORM\UnitOfWork 的 registerManaged() 方法。

// $this->em <--- Doctrine Entity Manager
// $entity <--- detached Entity (and we know that this entity already exists in DB for example)

$id = [$entity->getId()]; //array
$data = $entity->toArray(); //array

$this->em->getUnitOfWork()->registerManaged($entity, $id, $data);
当然,您可以在执行所需操作之前/之后使用 Doctrine\ORM\UnitOfWork 的 getEntityState() 检查您的实体的状态。
$this->eM->getUnitOfWork()->getEntityState($entity, $assert = 3)

$assert <-- This parameter can be set to improve performance of entity state detection by potentially avoiding a database lookup if the distinction between NEW and DETACHED is either known or does not matter for the caller of the method.

关于symfony - 如何在 Doctrine 3 中替换 EntityManager::merge?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51206823/

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