मैं अभी उसी समस्या पर काम कर रहा हूं इसलिए मैं आपका भ्रम समझता हूं। आपके पास बहुत सारे प्रश्न हैं, लेकिन मुझे लगता है कि उन्हें एक विलक्षण प्रश्न के रूप में अभिव्यक्त किया जा सकता है:
माइग्रेट मॉड्यूल एक सामान्यीकृत डेटाबेस को एक ड्रूपल इंस्टॉलेशन में माइग्रेट करने से कैसे निपटता है?
यह निश्चित रूप से सीधा नहीं है, लेकिन यहां मेरी समझ है कि यह कैसे काम करता है। हम ऊपर (वाइनवैन माइग्रेशन) से शुरू करेंगे और नीचे जाते ही सवाल पूछेंगे।
हम WineWineMigration
कक्षा के शीर्ष पर कोड को देखकर शुरू करते हैं ।
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
यह माइग्रेट मॉड्यूल को बताता है कि आपकी वाइन सामग्री को माइग्रेट करने के लिए, आश्रित माइग्रेशन - वाइनवरायटी, वाइनरेजियन, वाइनबेस्टविथ, वाइनयूज़र, वाइनप्रोड्यूस - को पहले पूरा किया जाना चाहिए।
इसलिए हमने यहां जो सीखा है, वह यह है कि पलायन अन्य प्रवासियों पर निर्भर हो सकता है ।
आगे हमारे पास टेबल के बीच मैपिंग है जो वर्तमान में बेस वाइन की जानकारी और ड्रुपल नोड रखती है:
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
यह बहुत सीधा है इसलिए यदि आपको स्पष्टीकरण की आवश्यकता है तो मैं इसे प्रदान करूंगा।
मैं कुछ अंतरिम सामान को छोड़ने जा रहा हूं जो वास्तव में विभिन्न श्रेणियों और शराब वस्तुओं को जोड़ने के लिए उचित नहीं है।
अब हम फील्ड मैपिंग के लिए आते हैं। का निरीक्षण करें:
// Mapped fields
$this->addFieldMapping('title', 'name')
->description(t('Mapping wine name in source to node title'));
$this->addFieldMapping('uid', 'accountid')
->sourceMigration('WineUser')
->defaultValue(1);
// TIP: By default, term relationship are assumed to be passed by name.
// In this case, the source values are IDs, so we specify the relevant
// migration (so the tid can be looked up in the map), and tell the term
// field handler that it is receiving tids instead of names
$this->addFieldMapping('migrate_example_wine_varieties', 'variety')
->sourceMigration('WineVariety')
->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_best_with', 'best_with')
->separator(',')
->sourceMigration('WineBestWith')
->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('field_migrate_example_wine_ratin', 'rating');
$this->addFieldMapping('field_migrate_example_top_vintag', 'best_vintages');
देखिये यह कहाँ कहता है:
->sourceMigration(...)
यह माइग्रेशन को इंगित करता है कि इस क्षेत्र को मैप करने के लिए, दूसरे माइग्रेशन को पहले संतुष्ट करना होगा। मेरा मानना है कि यह "द्वितीयक प्रवास" है जिसकी आपने बात की थी। region
उदाहरण के रूप में फ़ील्ड मैपिंग का उपयोग करते हैं। इसे तोड़कर ...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
यह कहता है कि स्रोत डेटाबेस में श्रेणी क्षेत्र एक क्षेत्र शब्दावली शब्द के लिए मैप किया गया है। जैसा कि TIP टिप्पणी फ़ील्ड मैपिंग कोड चंक में बताती है, यह मानती है कि फ़ील्ड_नाम के आधार पर मैपिंग बनाई जाती है, लेकिन चूंकि हम एक द्वितीयक माइग्रेशन पर निर्भर हैं, जैसा कि आप इसे डालते हैं, हमें माइग्रेशन निर्दिष्ट करने की आवश्यकता होती है जो इस पर निर्भर है और इसे निर्देश दें फ़ील्ड नामों के बजाय tids का उपयोग करें।
आपके स्रोत डेटाबेस में आपके पास मौजूद प्रत्येक सामान्यीकृत तालिका के लिए बहुत अधिक, आप प्रत्येक के लिए एक माइग्रेशन निर्दिष्ट करने जा रहे हैं, और फिर संबंधित फ़ील्ड मैपिंग में उन तालिकाओं को शामिल करते हैं, जिन्हें आप अपने फ़ील्ड मैपिंग कॉल में निर्भर माइग्रेशन निर्दिष्ट कर रहे होंगे। , साथ ही साथ प्रत्येक प्रवास की शुरुआत में आश्रित माइग्रेशन घोषणा।
आशा है कि ये आपकी मदद करेगा। मैं इसे पूरी तरह से खुद नहीं समझता हूं इसलिए मैंने इस सवाल का इस्तेमाल अपनी समझ को बढ़ाने के लिए किया कि कैसे माइग्रेट डेटाबेस से संबंधित है। जैसा कि मैंने थोड़ा और सीखा है, मैं अपने उत्तर को तदनुसार अपडेट करूंगा।