2011-11-07 16 views
7

में मैन्युअल रूप से प्राथमिक कुंजी कैसे सेट करें I Doctrine2 ORM का उपयोग कर एक नई Symfony2 प्रोजेक्ट में डेटा आयात कर रहा हूं।Doctrine2

सभी नए रिकॉर्ड एक स्वत: जनरेट प्राथमिक कुंजी होना चाहिए। हालांकि, मेरे आयात के लिए, मैं मौजूदा प्राथमिक कुंजी को संरक्षित करना चाहता हूं।

मैं अपने इकाई विन्यास के रूप में इस का उपयोग कर रहा:

type: entity 
    id: 
    id: 
     type: integer 
     generator: { strategy: AUTO } 

मैं अपने इकाई कक्षा में आईडी क्षेत्र के लिए एक सेटर बनाया है।

हालांकि, जब मैं इस इकाई को डेटाबेस में जारी रखता हूं और फ्लश करता हूं, तो मैन्युअल रूप से सेट की गई कुंजी को संरक्षित नहीं किया जाता है।

इसके लिए सबसे अच्छा कामकाज या समाधान क्या है?

उत्तर

3

निम्नलिखित उत्तर मेरा नहीं है लेकिन ओपी, जो इस प्रश्न में पोस्ट किया गया था। मैंने इसे इस समुदाय विकी उत्तर में ले जाया है।


मैं कनेक्शन ऑब्जेक्ट के संदर्भ संग्रहीत और प्रयोग किया जाता है कि मैन्युअल पंक्तियों और अद्यतन संबंधों को सम्मिलित करने के। यह पूरी तरह से persister और पहचान जेनरेटर से परहेज करता है। लेनदेन में इस काम को लपेटने के लिए कनेक्शन का उपयोग करना भी संभव है।

एक बार जब आप सम्मिलित बयान निष्पादित कर लेते हैं, तो आप संबंधों को अपडेट कर सकते हैं।

यह एक अच्छा समाधान है क्योंकि यह किसी भी संभावित समस्या से बचाता है जिसे आप लाइव सर्वर पर अपनी कॉन्फ़िगरेशन को स्वैप करते समय अनुभव कर सकते हैं।

अपने init समारोह में:

// Get the Connection 
    $this->connection = $this->getContainer()->get('doctrine')->getEntityManager()->getConnection(); 

अपने मुख्य शरीर में:

// Add a record to the database using Connection 
    protected function addRecord($columns, $oldRecord) 
    { 
    // Insert data into Record table 
    $record = array(); 
    foreach($columns as $key => $column) 
    { 
     $record[$column] = $oldRecord[$key]; 
    } 
    $record['id'] = $record['rkey']; 
    // Insert the data 
    $this->connection->insert('Record', $record); 
    } 
3

आपने पहले से ही यह माना है, लेकिन मेरा दृष्टिकोण जनरेटर रणनीति को आयात के लिए 'none' पर सेट करना होगा ताकि आप अपने क्लाइंट कोड में मौजूदा आईडी को मैन्युअल रूप से आयात कर सकें। फिर एक बार आयात पूरा हो जाने के बाद, जनरेटर रणनीति को 'ऑटो' पर बदलें ताकि आरडीबीएमएस वहां से निकल सके। एक सशर्त निर्धारित कर सकता है कि आईडी सेटर लागू किया गया है या नहीं। शुभकामनाएं - हमें बताएं कि आप क्या उपयोग करने का निर्णय लेते हैं।

+0

इस टिप के लिए धन्यवाद:

// Loop over my array of old data adding records $this->connection->beginTransaction(); foreach(array_slice($records, 1) as $record) { $this->addRecord($records[0], $record); } try { $this->connection->commit(); } catch(Exception $e) { $output->writeln($e->getMessage()); $this->connection->rollBack(); exit(1); } 

इस समारोह बनाएँ। मैं यह कर रहा हूं, लेकिन मुझे यकीन नहीं है कि यह आदर्श है या नहीं। मुझे लगता है कि मैं कच्चे डीक्यूएल प्रश्नों को निष्पादित कर सकता हूं। –

+0

मेरे समाधान के लिए ऊपर देखें। मैंने पीडीओ को एक सुखद इंटरफ़ेस के रूप में कनेक्शन ऑब्जेक्ट का उपयोग किया। –

+0

आईडी जनरेटर रणनीति को कैसे अक्षम करें (अस्थायी रूप से): http://www.ens.ro/2012/07/03/symfony2-doctrine-force-entity-id-on-persist/ – aimfeld

संबंधित मुद्दे