2013-02-04 8 views
5

Non sapevo davvero come intitolarlo o cercare una domanda già postata, quindi mi scuso se questo è stato visto qui prima.Doctrine2 ORM non aggiorna gli oggetti che sono alterati al di fuori di uno script

sto ottenendo alcuni risultati indesiderati con il seguente codice:

// get object managers 
$fooManager = $this->getContainer()->get('foo_manager'); 
$barManager = $this->getContainer()->get('bar_manager'); 

// infinite loop 
for (;;) { 

    // keep getting unitialized "foo" objects, or quit if none 
    while (($foo = $fooManager->findUninitialized()) !== null) { 

     // an uninitialized "foo" will need to make a "bar" object 
     $bar = $barManager->create(); 
     $bar->setA('...'); 

     // save "bar" to database, update() WILL perform a flush() 
     $barManager->update($bar); 

     // make the association of "bar" to "foo" 
     $foo->setBar($bar); 

     // save "foo" to database, update() WILL perform a flush() 
     $fooManager->update($foo); 

    } 

    // keep getting unprocessed "foo" objects, or quit if none 
    while (($foo = $fooManager->findUnprocessed()) !== null) { 

     // process the data from "foo" object's "bar" 
     process($foo->getBar()->getB()); 

    } 

} 

Si può vedere che nel primo ciclo while, $bar oggetti sono stati fatti e messi nel database. Un altro copione sta prendendo in mano questi e facendo loro qualcosa.

Nel secondo while ciclo, gli $foo oggetti tentano di accedere al loro oggetto modificato "bar" (notare la getB() essere chiamato, si può supporre che in un altro script eseguito separatamente setB() stato usato per cambiare lo stato dell'oggetto).

Tuttavia, nel secondo ciclo, quando chiamo getB(), non viene restituito il valore impostato con setB() in quell'altro script.

Posso garantire che tutti i dati siano correttamente mantenuti (e svuotati) nel database, quindi quando lo getB() viene chiamato in quel secondo ciclo, qualunque cosa fosse in attesa di "B" è stata modificata ed è presente nel database.

Una cosa che ho notato è che nel file di registro, non vedo una query per inserire i dati per "barra" quando chiamo $foo->getBar() nel secondo ciclo (questi dovrebbero essere caricati pigramente). Inoltre, se Iil valore restituito da $foo->getBar() nel secondo ciclo, sembra esattamente come l'oggetto "barra" associato sarebbe alla fine del primo ciclo.

Sto pensando che ci sia un qualche tipo di memorizzazione nella cache o qualcosa in corso (dal momento che ho modificato questi oggetti "barra" prima nell'esecuzione dello script, Doctrine sembra che stia semplicemente riutilizzando quelli piuttosto che ricaricando i loro dati dal database).

So che quello che sto cercando di fare probabilmente non è comune. Quello che sto facendo è usare le caratteristiche del comando della console Symfony2 per scrivere alcuni "demoni" da riga di comando per aiutare nell'elaborazione di alcuni dati; il "demone" che contiene questo codice viene eseguito insieme ad un altro "demone" che elabora quegli oggetti "a barre" che vengono creati.

Curioso di sapere se esiste un modo per risolvere questo problema nel punto in cui nel mio secondo ciclo quando chiamo il metodo $foo->getBar(), in realtà sto estraendo i dati aggiornati dal database. Qualsiasi aiuto è molto apprezzato.

+13

Hai provato questo? '$ em-> Aggiorna ($ entità);' – ChocoDeveloper

+0

Grazie! Questo ha funzionato. Ho passato le ultime ore a cercare e tutto quello che ho trovato nei documenti era forse usando una combinazione di '$ em-> detach ($ entity);' e '$ em-> merge ($ entity);', ma questo non aveva molto senso per me ... In nessun punto ho visto nulla nella documentazione di una funzione 'refresh ($ entity)'. – jzimmerman2011

risposta

23

Questo è stato davvero fornito dall'utente ChocoDeveloper. L'utilizzo del metodo refresh($entity) sul gestore delle entità ha risolto il mio problema.

Ad esempio:

$em->refresh($entity); 
+0

WOW !!! Grazie!! Lo uso in http://stackoverflow.com/questions/33771836/i-cant-remove-related-objects-with-entity-manager-flush-outside-a-loop/33787273#33787273 mi ha aiutato molto. –

+0

Grazie! Funziona come un fascino! –

+0

In realtà mi ha aiutato molto! Bene. –

Problemi correlati