我的实体使用以下注释作为其ID:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
从一个干净的数据库中,我正在从一个较旧的数据库中导入现有记录,并尝试保留相同的ID。然后,在添加新记录时,我希望MySQL像往常一样自动增加ID列。
不幸的是,Doctrine2似乎完全忽略了指定的ID。
新解决方案
根据以下建议,以下是首选解决方案:
$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());
旧解决方案
由于Doctrine脱离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上对其进行了测试,它可以按预期工作,这意味着具有自定义ID的实体与该ID一起存储,而没有指定ID的实体则使用lastGeneratedId() + 1
。
$metadata = $this->getEntityManager()->getClassMetaData(User::class); $metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);