В настоящее время я работаю с 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), которые можно использовать для этого?




Вы можете вставить дополнительный слой, где вы можете получать дату из пользовательского ввода (например, в режиме формы), и позволить
PropertyAccessor(или чему-то еще) сделать эту работу за вас. Я думаю, что это не проблема доктрины (и ее версии), а совершенно другая проблема с вашим кодом.