我的实体使用此注释作为其 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
.
虽然你的解决方案可以很好地与 MySQL 配合使用,但我未能使其与 PostgreSQL 配合使用,因为它是基于序列的。
我必须添加这一行以使其完美工作:
$metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)