Meine Entität verwendet diese Anmerkung für ihre ID:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
Aus einer sauberen Datenbank importiere ich vorhandene Datensätze aus einer älteren Datenbank und versuche, dieselben IDs beizubehalten. Wenn ich dann neue Datensätze hinzufüge, möchte ich, dass MySQL die ID-Spalte wie gewohnt automatisch inkrementiert.
Leider scheint Doctrine2 die angegebene ID vollständig zu ignorieren.
Neue Lösung
Gemäß den folgenden Empfehlungen ist Folgendes die bevorzugte Lösung:
$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());
Alte Lösung
Da Doctrine zur Bestimmung der Generatorstrategie von ClassMetaData abweicht, muss sie nach der Verwaltung der Entität im EntityManager geändert werden:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
Ich habe dies gerade unter MySQL getestet und es hat wie erwartet funktioniert, was bedeutet, dass Entitäten mit einer benutzerdefinierten ID mit dieser ID gespeichert wurden, während diejenigen ohne angegebene ID die verwendeten lastGeneratedId() + 1
.
$metadata = $this->getEntityManager()->getClassMetaData(User::class); $metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);