La mia entità utilizza questa annotazione per il suo ID:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
Da un database pulito, sto importando record esistenti da un database precedente e sto cercando di mantenere gli stessi ID. Quindi, quando si aggiungono nuovi record, voglio che MySQL incrementi automaticamente la colonna ID come al solito.
Sfortunatamente, sembra che Doctrine2 ignori completamente l'ID specificato.
Nuova soluzione
Secondo le raccomandazioni di seguito, la seguente è la soluzione preferita:
$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());
Vecchia soluzione
Poiché Doctrine si allontana da ClassMetaData per determinare la strategia del generatore, deve essere modificato dopo aver gestito l'entità in EntityManager:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
L'ho appena testato su MySQL e ha funzionato come previsto, il che significa che le entità con un ID personalizzato sono state memorizzate con quell'ID, mentre quelle senza un ID specificato hanno utilizzato l'estensione lastGeneratedId() + 1
.
$metadata = $this->getEntityManager()->getClassMetaData(User::class); $metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);