我的实体使用这个注解作为它的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
。
id
不能手动设置为0
。您必须使用更大的数字。当指定为 0 时,生成器仍将使用 AUTO 策略。在 doctrine 2.4 中进行了测试。 - Szymon Sadło$metadata = $this->getEntityManager()->getClassMetaData(User::class); $metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
- piotrekkr