tutorial symfony2 query onetomany generate consultas symfony doctrine

query - Genera id. Única-doctrina-symfony2



symfony 3.4 doctrine query (5)

Quiero generar una identificación de ticket única para mis boletos. Pero, ¿cómo dejar que la doctrina genere una identificación única?

/** * @ORM/Column(name="id", type="integer") * @ORM/Id() * @ORM/GeneratedValue(strategy="AUTO") */ protected $id;

poco más explicar:

  • Identificación debe ser 6 cartas como: 678915
  • La identificación debe ser única

A partir de la versión 2.3 , puede agregar las siguientes anotaciones a su propiedad:

/** * @ORM/Column(type="guid") * @ORM/Id * @ORM/GeneratedValue(strategy="UUID") */ protected $id;


Doctrine tratará este campo como su clave principal (debido a la anotación @Id ), por lo que este campo ya es único. Si tiene la anotación @GeneratedValue en la estrategia AUTO , Doctrine descubrirá qué estrategia usar dependernd en la plataforma db. Se establecerá por defecto en IDENTITY en MySql y el campo será un auto_increment luego.

Puede escribir la anotación de identificación sin los corchetes de la siguiente manera.

  • ORM / Id

Mientras respaldo el enfoque de UUID sugerido por Jonhathan, podría preferir un identificador más corto y más legible. En este caso, puede usar el paquete ShortId Doctrine .


Puede usar la anotación PrePersist, como esta:

/** * @ORM/PrePersist() */ public function preSave() { $this->id = uniqid(); }

Como sugiere el nombre de la anotación, se ejecutará antes de la persistencia del objeto en la base de datos.

Para la identificación única, simplemente uso una función php uniqid () nativa http://php.net/manual/en/function.uniqid.php que devolverá 13 caracteres. Para obtener solo 6 caracteres, consulte esta Generación de identificación de ticket de PHP

En la propiedad $ id, creo que también debe eliminar esta línea para evitar que se genere automáticamente el valor de la misma:

@ORM/GeneratedValue(strategy="AUTO")


Use la estrategia personalizada GeneratedValue:

1. En su clase de Entidad:

/** * @ORM/Id * @ORM/Column(type="integer") * @ORM/GeneratedValue(strategy="CUSTOM") * @ORM/CustomIdGenerator(class="AppBundle/Doctrine/RandomIdGenerator") */ protected $id;

2. Luego crea el archivo AppBundle/Doctrine/RandomIdGenerator.php con contenido

namespace AppBundle/Doctrine; use Doctrine/ORM/Id/AbstractIdGenerator; class RandomIdGenerator extends AbstractIdGenerator { public function generate(/Doctrine/ORM/EntityManager $em, $entity) { $entity_name = $em->getClassMetadata(get_class($entity))->getName(); // Id must be 6 digits length, so range is 100000 - 999999 $min_value = 100000; $max_value = 999999; $max_attempts = $min_value - $max_value; $attempt = 0; while (true) { $id = mt_rand($min_value, $max_value); $item = $em->find($entity_name, $id); if (!$item) { return $id; } // Should we stop? $attempt++; if ($attempt > $max_attempts) { throw new /Exception(''RandomIdGenerator worked hardly, but failed to generate unique ID :(''); } } } }