Возможно ли обновить объект так же, как показано ниже:
$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();
Это позволит вставить и изменить идентификатор объекта вместо обновления существующей строки в базе данных.
Вы должны вызвать слияние вместо сохранения:
$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
для обновления свойства объекта по идентификатору без получения состояния базы данных.
Это создаст простой прокси для работы с 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.