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

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

DonCallisto 09.07.2018 16:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
6
1
920
0

Другие вопросы по теме