Utilicé el nivel de acceso a la base de datos basado en consultas SQL durante mucho tiempo. Pero ahora decidí usar ORM Doctrine2. En este momento tengo un malentendido conceptual del flujo de trabajo de las entidades.¿Cómo puedo descartar los cambios no eliminados en una entidad en Doctrine 2?
mejor descrito por ejemplo:
try {
$user = $entityManager->find('User', 1);
$user->setName('New name');
$entityManager->flush();
}
catch (...)
{
// !we are here: changes failed and $user-row in DB was not updated
}
// ...
$user = $entityManager->find('User', 1);
$user->setOther('Other');
$entityManager->flush(); // <- in this request both [other] and [name] fields will be updated to DB, but only [other] update expected
En primer bloque de código I descabellada $ objeto de usuario. Cambió [nombre] e intentó guardarlo, pero falló. En el segundo bloque (no relacionado con el primero), busqué $ user object nuevamente. Pero ORM devolvió el enlace al mismo objeto como la primera vez. Entonces este objeto ya ha cambiado la propiedad [nombre]. En la última línea del segundo bloque, quería guardar solo [otro] archivado, pero tanto [otro] como [nombre] se actualizarán.
¿Cuál es la forma correcta de resolver esta situación?
Esta respuesta no es buena: si cualquier objeto en estado 'administrado' (es decir: manejado por 'entityManager' se refiere a un objeto separado, la doctrina pensará que el objeto separado es uno nuevo. El resultado es: si persiste se configura la operación en cascada, se realizará una inserción. Si no se configura ninguna operación persist en cascada, se generará un error "se encontró una nueva entidad ...". – DonCallisto