La entidad Doctrine2 con id varchar no inserta el id en la base de datos

Estoy tratando de crear entidad para Doctrine2 en la aplicación ZF2. Mi entidad debe tener id varchar (15), pero cuando bash crear una nueva fila, doctrine2 no introduce esta ID en la base de datos.

En la clase generada por la entidad, tengo esto:

/** * Checkpoints * * @ORM\Table(name="checkpoints", uniqueConstraints{@ORM\UniqueConstraint(name="sort", columns={"sort"})}, indexes={@ORM\Index(name="country", columns={"country"})}) * @ORM\Entity */ class Checkpoints { /** * @var string * * @ORM\Column(name="id", type="string", length=15, nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; // rest of the entity... 

¿Hay algo que deba cambiar para pasar esta identificación del formulario a la base de datos en doctrine flush?

Doctrine maneja el @ORM\GeneratedValue(strategy="Identity") diferente para cada base de datos. En el caso de MySql, se insertará un valor generado también conocido como AUTO_INCREMENT da como resultado un integer como ID. Por favor, eche un vistazo a http://docs.doctrine-project.org/en/2.0.x/reference/basic-mapping.html#identifiers-primary-keys .

En su caso, no debería usar la anotación GeneratedValue incluida su estrategia. Así que elimínalo por completo. Si desea el ID de su formulario, puede configurar un constructor en su entidad que establecerá su ID para esa entidad.

 class Checkpoints { public function __constructor($id) { $this->id = $id; } /** * @var string * * @ORM\Column(name="id", type="string", length=15, nullable=false) * @ORM\Id */ private $id; // rest of the entity... } 

Observe que no mencionar la anotación GeneratedValue es lo mismo que GenerateValue(strategy="None") .

Por supuesto, puede establecer su ID más tarde después de crearlo, pero cada instancia de esta entidad necesita una ID, por lo que es mejor forzarla a establecerla por su constructor.

Entonces, en su controlador probablemente usará algo como esto

 if ($form->isValid() { $formData = $form->getData(); $checkpoint = new Checkpoints($formData['id']); } 

Como mencionó, le gustaría establecer el ID con la entrada de su formulario. Pero déjenme señalar que el usuario puede poner claves duplicadas. Para atraparlo debes verificar si un objeto ya existe y en ese caso recomendaría usar \DoctrineModule\Validator\NoObjectExists . Consulte https://github.com/doctrine/DoctrineModule/blob/master/docs/validator.md sobre los validadores de Doctrine.

Entonces, para verificar si existe un objeto con la ID, puede agregar este validador a su filtro de entrada de su formulario:

 public function getInputFilterSpecification() { $entityManager = $this->serviceManager->get('Doctrine\ORM\EntityManager'); return array( 'id' => array( 'validators' => array( array( 'name' => 'DoctrineModule\Validator\NoObjectExists', 'options' => array( 'object_repository' => $entityManager->getRepository('Application\Entity\Checkpoints'), 'fields' => 'id' ) ) ) ) ); } 

Así que ahora sabemos que la ID proporcionada está disponible para una nueva entidad de Checkpoints .

Solo elimina la linea

 * @ORM\GeneratedValue(strategy="IDENTITY") 

formar su entidad e insertará el registro en su entidad