2012-05-25 1 views
6

Ho utilizzato per molto tempo il livello di accesso al database basato su query SQL. Ma ora ho deciso di usare ORM Doctrine2. In questo momento ho un equivoco concettuale del flusso di lavoro delle entità.Come posso eliminare le modifiche non scaricate a un'entità in Doctrine 2?

meglio descritta con l'esempio:

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 

Nel blocco primo codice Presi $ oggetto utente. Modificato [nome] e provato a salvarlo, ma fallito. Nel secondo blocco (non correlato al primo) ho recuperato di nuovo l'oggetto $ user. Ma ORM ha restituito il link allo stesso oggetto la prima volta. Quindi questo oggetto ha già cambiato la proprietà [nome]. Nell'ultima riga del secondo blocco volevo salvare solo [altro] archiviato, ma sia [altro] che [nome] saranno aggiornati.

Qual è il modo giusto per risolvere questa situazione?

risposta

14

Questo è di progettazione.

Il gestore di entità garantisce che si ottiene sempre la stessa entità indietro per un determinato ID. Dopotutto, questo è ciò che significa identità. Può esserci un solo, unico utente con ID 1.

Se si desidera "aggiornare" un'entità dal database, EntityManager::refresh() lo farà per voi. Da i documenti:

Aggiorna lo stato persistente di un'entità dal database, ignorando eventuali modifiche locali che non sono ancora state mantenute.

2

È necessario eseguire il comando: $entityManager->detach($userEntity);. Le modifiche quindi non si rifletteranno nel database dopo aver chiamato flush. Altre entità funzioneranno.

+2

Questa risposta non è buona: se qualsiasi oggetto nello stato 'managed' (cioè: gestito da' entityManager' si riferisce ad un oggetto distaccato, la dottrina penserà che l'oggetto staccato è un nuovo di zecca. l'operazione in cascata è configurata, verrà eseguito un inserimento. Se non viene configurata l'operazione continua in cascata, verrà generato un errore "una nuova entità è stata trovata ...". – DonCallisto