如何在不使用合并的情况下更新/替换Doctrine中的现有对象/实体?

时间:2018-07-09 09:14:04

标签: symfony doctrine-orm doctrine

目前,我正在Doctrine 2项目中使用Symfony 2.8。在线数据可以与移动应用程序同步。当在线项目从移动应用程序接收数据时,接收到的实体将从JSON和merged反序列化到在线数据库中。自动使用$entityManger->merge($receivedEntity)可确保插入新实体,并更新现有实体。

此功能很好EntityManager::merge将不再受Doctrine 3的支持。

为此,我想手动进行合并:

public function mergeEntity($receivedEntity, $class) {
   $repo = $this->em->getRepository($class);
   $existingEntity = $repo->findOneById($receivedEntity->getId());

   if (!$existingEntity) {
       // Insert NEW entity
       $this->em->persist($receivedEntity);
       $this->em->flush();
   } else {
       // Update EXISTING entity
       $existingEntity->setProperty1($receivedEntity->getProperty1());
       $existingEntity->setProperty2($receivedEntity->getProperty2());
       ...
       $existingEntity->setPropertyN($receivedEntity->getPropertyN());

       $this->em->persist($existingEntity);
       $this->em->flush();
   }
}

虽然这项工作很麻烦,但也不是很灵活。实体类别每次更改时,例如如果添加,删除或更新了属性,则合并方法也必须更新。此外,该方法仅适用于一个特定的类,并且每个实体类都需要有自己的合并方法。

尽管可以使用反射来限制这些问题,但它仍然比现有的EntityManager::merge ...复杂得多。

是否有可能以新的“版本”替换现有实体?

// Is something like this possible/available?
$this->em->replaceEntity($receivedEntity);

简而言之::创建完全自定义的更新/替换方法是更新现有实体的正确方法吗?还是在merge旁边有任何内置功能可用于实现此目的?

0 个答案:

没有答案