Tổ chức của tôi sử dụng chú thích này cho ID của nó:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
Từ cơ sở dữ liệu sạch, tôi đang nhập các bản ghi hiện có từ cơ sở dữ liệu cũ hơn và cố gắng giữ các ID giống nhau. Sau đó, khi thêm các bản ghi mới, tôi muốn MySQL tự động tăng cột ID như bình thường.
Thật không may, có vẻ như Doctrine2 hoàn toàn bỏ qua ID được chỉ định.
Giải pháp mới
Theo các khuyến nghị dưới đây, giải pháp sau là giải pháp ưu tiên:
$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());
Giải pháp cũ
Vì Doctrine xoay quanh ClassMetaData để xác định chiến lược trình tạo, nó phải được sửa đổi sau khi quản lý thực thể trong EntityManager:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
Tôi vừa thử nghiệm điều này trên MySQL và nó hoạt động như mong đợi, có nghĩa là Các thực thể có ID tùy chỉnh được lưu trữ với ID đó, trong khi những thực thể không có ID được chỉ định sử dụng lastGeneratedId() + 1
.
$metadata = $this->getEntityManager()->getClassMetaData(User::class); $metadata->setIdGenerator(new AssignedGenerator()); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);