Обновление доктрины 2 от объекта

Возможно ли обновить объект так же, как показано ниже:

$data = new ATest(); // my entity $data->id = 1; // id 1 already exists, I just want to update this row $data->name = "ORM Tested"; // changed the name $entityManager->persist($data); $entityManager->flush(); 

Это позволит вставить и изменить идентификатор объекта вместо обновления существующей строки в базе данных.

Related of "Обновление доктрины 2 от объекта"

Вы должны вызвать слияние вместо сохранения:

 $data = new MyEntity(); $data->setId(123); $data->setName('test'); $entityManager->merge($data); $entityManager->flush(); 

Мне пришлось использовать

 $entityManager->merge($data) 

Или просто получить управляемую сущность, а не пустую.

 $data = $entityManager->getRepository('ATest')->findOne(1); // ATest is my entitity class $data->name = "ORM Tested"; // just change the name $entityManager->persist($data); $entityManager->flush(); 

Если объект уже управляется, persist () обновит его, а не добавит новый.

Вы также можете использовать getReference для обновления свойства объекта по идентификатору без получения состояния базы данных.

http://doctrine-orm.readthedocs.org/en/latest/reference/advanced-configuration.html#reference-proxies

Это создаст простой прокси для работы с Entity by ID вместо создания экземпляра new Entity или явного получения Entity из базы данных с помощью find() , который затем может быть обновлен с помощью flush.

 $data = $entityManager->getReference('ATest', $id); $data->setName('ORM Tested'); $entityManager->flush(); 

Это особенно полезно для обновления OneToMany или ManyToMany объекта. EG: $case->addTest($data);

Как правило, плохой практикой является ручной набор идентификатора нового объекта, даже если целью является обновление объекта. Вместо этого обычно лучше всего позволить EntityManager устанавливать соответствующие идентификаторы. По этой причине Doctrine генерирует сущности по умолчанию с идентификатором как частным свойством без метода setter.