หน่วยงานของฉันใช้คำอธิบายประกอบนี้เพื่อเป็น 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());
โซลูชันเก่า
เนื่องจากหลักคำสอนหมุนออกจาก 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
.