Обновление Доктрины 2 от сущности - PullRequest
43 голосов
/ 13 апреля 2011

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

$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();

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

Ответы [ 4 ]

88 голосов
/ 22 февраля 2012

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

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

$entityManager->merge($data);
$entityManager->flush();
53 голосов
/ 13 апреля 2011

Я должен был использовать

$entityManager->merge($data)
13 голосов
/ 15 декабря 2012

Или просто получите управляемый объект, а не пустой.

$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 () обновит его, а не вставит новый.

12 голосов
/ 03 февраля 2015

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

https://www.doctrine -project.org / projects / doctrine-orm / en / 2.6 /reference / advanced-configuration.html # reference-proxies

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

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

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

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

...