2012-05-25 12 views
6

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?

Respuesta

14

Esto es por diseño.

El administrador de entidades garantiza que siempre obtenga la misma entidad para un ID determinado. Después de todo, eso es lo que significa identidad. Solo puede haber un único usuario único con Id. 1.

Si desea "actualizar" una entidad de la base de datos, EntityManager::refresh() lo hará por usted. De los documentos:

Actualiza el estado persistente de una entidad de la base de datos, anulando cualquier cambio local que aún no se haya conservado.

2

Debe ejecutar el comando: $entityManager->detach($userEntity);. Los cambios no se reflejarán en la base de datos luego de que usted llame a Flush. Otras entidades funcionarán.

+2

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

Cuestiones relacionadas