Mi entidad usa esta anotación para su ID:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
De una base de datos limpia, estoy importando registros existentes de una base de datos más antigua y trato de mantener las mismas ID. Luego, al agregar nuevos registros, quiero que MySQL aumente automáticamente la columna de ID como de costumbre.
Desafortunadamente, parece que Doctrine2 ignora por completo el ID especificado.
Nueva solucion
Según las recomendaciones a continuación, la siguiente es la solución preferida:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());
Solución antigua
Debido a que Doctrine gira fuera de ClassMetaData para determinar la estrategia del generador, debe modificarse después de administrar la entidad en EntityManager:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
Acabo de probar esto en MySQL y funcionó como se esperaba, lo que significa que las Entidades con una ID personalizada se almacenaron con esa ID, mientras que aquellas sin una ID especificada usaron el lastGeneratedId() + 1
.
$metadata = $this->getEntityManager()->getClassMetaData(User::class); $metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);