Подтвердить что ты не робот

Обновление доктрины 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();

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

4b9b3361

Ответ 1

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

$entityManager->merge($data)

Ответ 2

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

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

$entityManager->merge($data);
$entityManager->flush();

Ответ 3

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

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

Ответ 4

Вы также можете использовать 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.