Moja jednostka używa tej adnotacji jako swojego identyfikatora:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
Z czystej bazy danych importuję istniejące rekordy ze starszej bazy danych i staram się zachować te same identyfikatory. Następnie podczas dodawania nowych rekordów chcę, aby MySQL jak zwykle automatycznie zwiększał wartość kolumny ID.
Niestety, wygląda na to, że Doctrine2 całkowicie ignoruje podany identyfikator.
Nowe rozwiązanie
Zgodnie z poniższymi zaleceniami preferowanym rozwiązaniem jest:
$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());
Stare rozwiązanie
Ponieważ Doctrine opiera się na ClassMetaData w celu określenia strategii generatora, musi zostać zmodyfikowana po zarządzaniu encją w EntityManager:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
Właśnie przetestowałem to na MySQL i działało zgodnie z oczekiwaniami, co oznacza, że jednostki z niestandardowym identyfikatorem były przechowywane z tym identyfikatorem, podczas gdy te bez określonego identyfikatora używały rozszerzenia lastGeneratedId() + 1
.