Как заменить EntityManager :: merge в Doctrine 3? - PullRequest
0 голосов
/ 06 июля 2018

Я работаю над проектом веб-приложения на основе 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), который автоматически проверяет, требуется ли вставка или обновление.

Хоть это решить?

Конечно, я мог бы проверить для каждого полученного объекта, существует ли объект с таким же идентификатором. В этом случае можно загрузить существующий объект и обновить его свойства вручную. Однако это было бы очень громоздко. Разумеется, в реальном проекте используется много разных сущностей, и каждый тип / класс сущностей должен иметь свою собственную обработку для проверки того, какие свойства необходимо обновить. Нет ли лучшего решения?

...