2013-03-13 7 views
6

È possibile confrontare lo stato di un oggetto entità tra la versione "sporca" corrente (un oggetto che ha alcune delle sue proprietà modificate, non ancora persistente) e la versione "originale" (i dati sono ancora nel database).Entità Doctrine2 - È possibile confrontare un oggetto "sporco" con uno dal database

La mia ipotesi era che potevo avere un oggetto "sporco", quindi estrarne uno nuovo dal DB e confrontare i due. Per esempio:

$entity = $em->getRepository('MyContentBundle:DynamicContent')->find($id); 

$editForm = $this->createContentForm($entity); 
$editForm->bind($request); 

if ($editForm->isValid()) { 
    $db_entity = $em->getRepository('MyContentBundle:DynamicContent')->find($id); 

    // compare $entity to $db_entity 

    $em->persist($entity); 
    $em->flush(); 

    return $this->redirect($this->generateUrl('content_edit', array('id' => $id))); 
} 

Ma nella mia esperienza, $ entità e $ db_entity sono sempre lo stesso oggetto (e hanno gli stessi dati come $ entità, dopo che il modulo di richiesta di associazione $). C'è un modo per ottenere una nuova versione dell'entità $ accanto alla versione "sporca" a fini di paragone? Le soluzioni che ho visto tutte estraggono i dati necessari prima che si verifichi il bind del modulo, ma preferirei non avere questa limitazione.

Aggiornamento: Per chiarire, non cerco solo le modifiche alle proprietà delle entità ma anche le relative raccolte di entità.

+0

chiedo in modo specifico per Ican fare una soluzione migliore per la rimozione di elementi da un modulo di raccolta Symfony2.[La soluzione corrente] (http://symfony.com/doc/2.0/cookbook/form/collections.html#templates-modifications) dove si estraggono i valori prima che il binding appaia troppo limitante e non favorisca una buona funzionalità per occupatene. –

+0

Questo è un duplicato di http://stackoverflow.com/questions/9057558/new-built-in-way-to-get-all-the-changed-fields-in-doctrine-2/9057705#9057705 – Ocramius

+0

dovrei espandi la portata della mia domanda, dal momento che non sto solo cercando le modifiche all'entità stessa, ma anche le modifiche alle raccolte correlate all'interno dell'entità. Usare UnitOfWork aiuta solo con il primo. Tuttavia, sembra che il suggerimento di Alex di usare $ em-> clear() prima di fare un altro find() otterrà l'entità "fresca" che sto cercando. –

risposta

5

Dopo lavare i $em succede (è impegnata) nel database .. quindi ... si potrebbe desiderare di recuperare il $db_entity prima flush()


  1. Non sono sicuro di cosa desideri .. ma puoi anche utilizzare merge anziché persist.

    • merge viene restituita l'oggetto modificato - id generato e impostato
    • persist sta modificando l'istanza
  2. Se si vuole avere l'oggetto modificato e non persisted usarlo prima di flush.

  3. EntityManager ti dà la stessa istanza, perché hai fatto non $em->clear()
    • flush è commettere tutte le modifiche (tutti gli oggetti) dirty
    • clear è svuotare la cache di memoria. così quando si find(..., $id), si otterrà una marca nuova istanza
  4. è clone parola chiave lavorando per voi? come in questo esempio:

$entity = $em->find('My\Entity', $id); 
$clonedEntity = clone $entity; 

E si potrebbe anche voler leggere questo: Implementing Wakeup or Clone

+0

Whoops, il mio esempio era cattivo e l'ho aggiornato. $ Db_entity deve essere recuperato prima di persist() e flush(). Anche quando lo fai, $ entity e $ db_entity sono gli stessi. –

+0

aggiunto un'altra soluzione al mio post (la parte 'clone') – Alex

9

È possibile ottenere ciò che è cambiato sull'entità tramite UnityOfWork di Doctine. È abbastanza semplice: dopo aver persistito l'entità, Doctrine sa cosa aggiornare nel database. È possibile ottenere queste informazioni facendo:

// Run these AFTER persist and BEFORE flush 
$uow = $em->getUnitOfWork(); 
$uow->computeChangeSets(); 
$changeset = $uow->getEntityChangeSet($entity); 
+1

Può essere chiamato in un controller? Perché quando provo a farlo, non mostra alcuna modifica per la mia entità (solo array vuoto). –

+2

Assicurati di leggere l'avviso relativo a questo metodo in questo post: http://stackoverflow.com/questions/9057558/is-there-a-built-in-way-to-get-all-of-the-changed -aggiornati-campi-in-a-doctrine-2 – tiho