2012-05-07 15 views
10

C'è un modo per ottenere un ID entità prima del persist/flush? voglio dire:Doctrine2 - Ottieni ID entità prima dello svuotamento

$entity = new PointData(); 
$form = $this->createForm(new PointDataType(), $entity); 

Se provo $ entity> getId() a questo punto, si restituisce nulla.

posso farlo funzionare da:

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

(supponendo $ em = $ this-> getDoctrine() -> getEntityManager();)

Come posso raggiungere questo obiettivo?

+0

leggere su [strategie di generazione di identificatore] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifiers-primary- chiavi) sulle pagine di documentazione di Doctrine. – Crozin

+0

Grazie Crozin. Avevo già letto tutte quelle cose. Non sto cercando di ottenere il prossimo indice automatico. Fallirebbe se 2 utenti chiamassero quell'azione simultaneamente. – Xavi

risposta

23

Se si desidera conoscere l'ID di un'entità prima che sia stata mantenuta nel database, ovviamente non è possibile utilizzare gli identificatori generati. Dovrai trovare un modo per generare autonomamente identificatori univoci (forse una sorta di funzione di hash può produrre valori sufficientemente unici).

Raramente questa è una buona idea, quindi è necessario fare attenzione.

Vorrei riflettere molto attentamente sul motivo per cui ho bisogno di conoscere l'identificatore prima del colore. Doctrine è abbastanza bravo a farti costruire un grande oggetto grafico, e persistere/svuotarlo tutto in una volta. Sembra probabile che tu abbia qualcosa di brutto nella tua architettura che stai cercando di aggirare. Potrebbe essere una buona idea rivederlo prima di scendere lungo il percorso generato dall'applicazione.

+0

Grazie mille per la risposta. – Xavi

+0

Forse potresti utilizzare UUID per questa attività, dal momento che sono praticamente unici (https://en.wikipedia.org/wiki/Universally_unique_identifier) ​​e possono essere generati in anticipo, ad esempio da PHP. Non mi piacciono molto, ma sarebbe una buona soluzione. – JorgeeFG

+1

@JorgeeFG - Assolutamente. Gli UUID sono ottimi per questo caso d'uso. Negli anni trascorsi da quando ho scritto questa risposta, ho iniziato a preferire gli UUID come identificatori per le entità. https://github.com/ramsey/uuid è una libreria abbastanza solida per generarli e https://github.com/ramsey/uuid-doctrine fornisce un'implementazione del tipo di dottrina che funziona bene. – timdev