2012-05-07 20 views
10

¿Hay alguna manera de obtener una ID de entidad antes de persist/flush? quiero decir:Doctrine2 - Obtenga ID de entidad antes de vaciar

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

Si intento $ entidad-> getId() en este punto, no devuelve nada.

puedo conseguir que funcione por:

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

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

¿Cómo puedo lograr esto?

+0

Leer sobre las estrategias de generación de identificador [] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifiers-primary- teclas) en las páginas de documentación de Doctrine. – Crozin

+0

Gracias Crozin. Ya había leído todas esas cosas. No estoy tratando de obtener el próximo índice automático. Fallaría si 2 usuarios llamaran a esa acción simultáneamente. – Xavi

Respuesta

23

Si desea conocer el ID de una entidad antes de que se haya conservado en la base de datos, entonces obviamente no puede usar identificadores generados. Tendrá que encontrar la forma de generar identificadores únicos usted mismo (tal vez algún tipo de función hash puede producir valores únicos).

Esto rara vez es una buena idea, por lo tanto, debe tener cuidado.

Pensaré detenidamente acerca de por qué necesito saber el identificador antes de enjuagar. Doctrine es bastante bueno al permitirle construir un gran gráfico de objetos, y persistir/enjuagarlo todo a la vez. Es probable que tengas algo feo en tu arquitectura que intentas solucionar. Puede ser una buena idea revisar eso antes de bajar por la ruta de ID generada por la aplicación.

+0

Muchas gracias por su respuesta. – Xavi

+0

Tal vez podría usar UUID para esta tarea, ya que son prácticamente únicos (https://en.wikipedia.org/wiki/Universally_unique_identifier) ​​y se pueden generar de antemano, desde PHP, por ejemplo. No me gustan mucho, pero sería una buena solución. – JorgeeFG

+1

@JorgeeFG - Absolutamente. Los UUID son geniales para este caso de uso. En los años transcurridos desde que escribí esta respuesta, comencé a preferir los UUID como identificadores para las entidades. https://github.com/ramsey/uuid es una biblioteca bastante sólida para generarlos, y https://github.com/ramsey/uuid-doctrine proporciona una implementación de tipo de doctrina que funciona bien. – timdev

Cuestiones relacionadas