मेरी संस्था इस एनोटेशन का उपयोग आईडी के लिए करती है:
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
एक स्वच्छ डेटाबेस से, मैं पुराने डेटाबेस से मौजूदा रिकॉर्ड में आयात कर रहा हूं और समान आईडी रखने की कोशिश कर रहा हूं। फिर, नए रिकॉर्ड जोड़ते समय, मैं चाहता हूं कि MySQL हमेशा की तरह आईडी कॉलम को ऑटो-इंक्रीमेंट करे।
दुर्भाग्य से, ऐसा प्रतीत होता है कि Doctrine2 निर्दिष्ट आईडी की पूरी तरह से उपेक्षा करता है।
नया समाधान
नीचे दी गई सिफारिशों के अनुसार, निम्नलिखित पसंदीदा समाधान है:
$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());
पुराना हल
क्योंकि जनरेटर की रणनीति का निर्धारण करने के लिए क्लासमैटाटाटा के डॉक्ट्रिन पिवोट्स हैं, इसे एंटिटीमैनगर में इकाई के प्रबंधन के बाद संशोधित किया जाना है:
$this->em->persist($entity);
$metadata = $this->em->getClassMetaData(get_class($entity));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$this->em->flush();
मैंने सिर्फ MySQL पर यह परीक्षण किया और यह उम्मीद के मुताबिक काम किया, जिसका अर्थ है कि एक कस्टम आईडी के साथ संस्थाओं को उस आईडी के साथ संग्रहीत किया गया था, जबकि बिना आईडी वाले लोग इसका उपयोग नहीं करते थे lastGeneratedId() + 1
।