Я работаю над проектом веб-приложения на основе Symfony 2.8
, который в настоящее время использует Doctrine 2
. Проект представляет собой простое приложение со списком задач, которое можно синхронизировать с мобильным приложением (iOS / Android).
Читая заметки об обновлении Doctrine 3
, я обнаружил, что EntityManager::merge
больше не будет поддерживаться .
Альтернатива EntityManager # merge () не предоставляется ORM 3.0,
поскольку семантика слияния должна быть частью бизнес-сферы
а не домен персистентности приложения. Если твой
приложение сильно зависит от CRUD-подобных взаимодействий и / или PATCH
успокоительные операции, вы должны смотреть на альтернативы, такие как
JMSSerializer.
Я не уверен, что является лучшим / правильным способом замены EntityManager::merge
?
Где использовать слияние:
Во время синхронизации мобильных приложений с веб-приложением данные передаются в виде сериализованного JSON, который затем десериализуется с помощью JMSSerializer
в объектный объект. Когда веб-приложение получает объект ToDoEntry
таким образом, это может быть новая ToDo-запись (еще не известная в веб-приложении) или обновленная существующая запись. В любом случае, полученный объект не управляется EntityManager
. Таким образом $em->persist($receivedObject)
всегда будет пытаться вставить новый объект. Это не удастся (из-за уникального ограничения идентификатора), если ToDo-Entry уже существует в веб-приложении и требует обновления.
Вместо этого используется $em->merge($receivedObject)
, который автоматически проверяет, требуется ли вставка или обновление.
Хоть это решить?
Конечно, я мог бы проверить для каждого полученного объекта, существует ли объект с таким же идентификатором. В этом случае можно загрузить существующий объект и обновить его свойства вручную. Однако это было бы очень громоздко. Разумеется, в реальном проекте используется много разных сущностей, и каждый тип / класс сущностей должен иметь свою собственную обработку для проверки того, какие свойства необходимо обновить. Нет ли лучшего решения?