ตอนนี้ฉันกำลังแก้ไขปัญหาเดียวกันอยู่ดังนั้นฉันจึงเข้าใจความสับสนของคุณ คุณมีคำถามมากมาย แต่ฉันคิดว่าพวกเขาสามารถสรุปเป็นคำถามเอกพจน์:
โมดูลโอนย้ายจัดการการโยกย้ายฐานข้อมูลปกติในการติดตั้ง Drupal อย่างไร
ไม่ตรงไปตรงมาแน่นอน แต่นี่เป็นความเข้าใจของฉันเกี่ยวกับวิธีการทำงาน เราจะเริ่มจากด้านบน (WineWineMigration) ลงไปและถามคำถามขณะที่เราไป
เราเริ่มต้นด้วยการดูรหัสที่ด้านบนของWineWineMigration
ชั้นเรียน
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
สิ่งนี้บอกโมดูลการย้ายข้อมูลว่าในการโยกย้ายเนื้อหาไวน์ของคุณการโยกย้ายที่ขึ้นอยู่กับ - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - จะต้องเสร็จสิ้นก่อน
ดังนั้นสิ่งที่เราได้เรียนรู้ว่านี่คือการโยกย้ายอาจจะขึ้นอยู่กับการโยกย้ายอื่น ๆ
ต่อไปเรามีการทำแผนที่ระหว่างตารางที่เก็บข้อมูลไวน์ฐานและโหนด Drupal ในปัจจุบัน:
$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 ระบุในโค้ดการแมปฟิลด์ฟิลด์จะถือว่าการแมปนั้นทำโดยยึดตาม field_names แต่เนื่องจากเราขึ้นอยู่กับการย้ายข้อมูลรองตามที่คุณวางไว้เราจำเป็นต้องระบุการโยกย้ายที่ขึ้นอยู่กับและแนะนำให้ ใช้ tids แทนชื่อฟิลด์
สวยมากสำหรับทุกตารางปกติที่คุณมีในฐานข้อมูลต้นทางของคุณคุณจะต้องระบุการโยกย้ายสำหรับแต่ละคนและจากนั้นในการแมปฟิลด์ที่เกี่ยวข้องที่เกี่ยวข้องกับตารางเหล่านั้นคุณจะระบุการโยกย้ายที่ต้องพึ่งพาในการโทรแมปฟิลด์ของคุณ เช่นเดียวกับการประกาศการย้ายถิ่นที่ขึ้นอยู่กับจุดเริ่มต้นของการโยกย้ายแต่ละครั้ง
ฉันหวังว่านี่จะช่วยได้. ฉันไม่เข้าใจตัวเองอย่างเต็มที่ดังนั้นฉันจึงใช้คำถามนี้เป็นโอกาสในการเพิ่มความเข้าใจเกี่ยวกับวิธีการย้ายข้อมูลที่เกี่ยวข้องกับฐานข้อมูล เมื่อฉันเรียนรู้มากขึ้นฉันจะอัปเดตคำตอบของฉันตามนั้น