Моя організація використовує цю примітку для свого ідентифікатора:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
З чистої бази даних я імпортую наявні записи зі старої бази даних і намагаюся зберегти ті самі ідентифікатори. Потім, додаючи нові записи, я хочу, щоб MySQL автоматично збільшував стовпчик ідентифікаторів, як зазвичай.
На жаль, схоже, що Doctrine2 повністю ігнорує вказаний ідентифікатор.
Нове рішення
Згідно з наведеними нижче рекомендаціями, найкращим рішенням є наступне:
$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());
Старе рішення
Оскільки Доктрина відхиляє ClassMetaData для визначення генераторної стратегії, вона повинна бути змінена після управління сутністю в EntityManager:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
Я щойно тестував це на MySQL, і він працював як слід, тобто об'єкти зі спеціальним ідентифікатором зберігалися з цим ідентифікатором, тоді як ті, хто не вказав ідентифікатор, використовували lastGeneratedId() + 1
.
$metadata = $this->getEntityManager()->getClassMetaData(User::class); $metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);