目前,我正在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
旁边有任何内置功能可用于实现此目的?