2010-08-18 13 views

risposta

140

ho dovuto usare questo dopo che il filo di ottenere l'ultimo inserto ID:

$em->persist($user); 
$em->flush(); 
$user->getId(); 
+2

Non posso usarlo. Ottenere errore Chiamare al metodo non definito Test \ Entity \ Test :: getId() in "Il mio progetto" –

+0

@ noobie-php È necessario definire un public getter per il proprio ID (se questo è privato come dovrebbe essere) – cheesemacfly

+0

@cheesemacfly : Ho già risolto questo errore viene generato (nel mio scenario) quando non siamo in grado di flush() per qualsiasi motivo, una volta che Flush() viene eseguito correttamente getID() inizia a funzionare, assumendo getter e setter non sono un problema qui –

9

Calling flush() può potenzialmente aggiungere un sacco di nuove entità, per cui ci riesca davvero il concetto di "lastInsertId". Tuttavia Doctrine popolerà i campi identità ogni volta che ne viene generato uno, quindi l'accesso al campo id dopo aver chiamato flush conterrà sempre l'ID di una nuova entità "persistente".

29

È possibile accedere all'ID dopo aver chiamato il metodo persistente del gestore entità.

$widgetEntity = new WidgetEntity(); 
$entityManager->persist($widgetEntity); 
$entityManager->flush(); 
$widgetEntity->getId(); 

È fai necessità di irrigare al fine di ottenere questo ID.

Sintassi Errore Correzione: Aggiunto punto e virgola dopo $ entityManager-> flush() viene chiamato.

+6

Ho dovuto svuotare per recuperare il valore. Persistere non è stato sufficiente, dal momento che gli elementi non vengono effettivamente scritti nel database finché non si svuota. –

3

Un po 'in ritardo per rispondere alla domanda. Ma,

Se si tratta di un database MySQL

dovrebbe $doctrine_record_object->id lavoro se AUTO_INCREMENT è definito nel database e nella definizione della tabella.

17

Se non si utilizza entità ma di SQL Server Native come mostrato here allora si potrebbe desiderare di ottenere l'ultimo ID inserito come illustrato di seguito:

$entityManager->getConnection()->lastInsertId() 

Per i database con sequenze come PostgreSQL prega di notare che è possibile fornire il nome della sequenza come primo parametro del metodo lastInsertId.

$entityManager->getConnection()->lastInsertId($seqName = 'my_sequence') 

Per ulteriori informazioni un'occhiata al codice su GitHub here e here.

+0

Potrebbe non funzionare con tutti i DBMS. Ad esempio, non funziona con Postgres (a causa delle sequenze) –

+0

Fantastico !! Ho passato ore a cercare questo piccolo frammento. – MikeGA

+4

@ paul.ago Hai solo bisogno di conoscere il nome della sequenza, ad esempio: 'lastInsertId ('articles_id_seq')' – ChocoDeveloper