私のエンティティはその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);