Saya sedang mengerjakan masalah yang sama sekarang jadi saya mengerti kebingungan Anda. Anda memiliki banyak pertanyaan, tetapi saya pikir mereka dapat diringkas menjadi pertanyaan tunggal:
Bagaimana modul Migrasi menangani migrasi database yang dinormalisasi ke dalam instalasi Drupal?
Ini jelas tidak mudah, tapi inilah pemahaman saya tentang cara kerjanya. Kami akan mulai dari atas (WineWineMigration) turun dan mengajukan pertanyaan saat kami pergi.
Kami memulai dengan melihat kode di bagian atas WineWineMigration
kelas.
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
Ini memberi tahu modul Migrasi bahwa untuk memigrasi konten Wine Anda, migrasi bergantung - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - harus diselesaikan terlebih dahulu.
Jadi yang kami pelajari di sini adalah bahwa migrasi dapat bergantung pada migrasi lain .
Berikutnya kita memiliki pemetaan antara tabel yang saat ini menyimpan info anggur dasar dan simpul Drupal:
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
Ini cukup mudah jadi jika Anda perlu klarifikasi saya akan berikan.
Saya akan melewatkan beberapa hal sementara yang tidak benar-benar berkaitan dengan menghubungkan berbagai kategori dan objek anggur.
Sekarang kita sampai ke pemetaan lapangan. Mengamati:
// 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');
Lihat di mana dikatakan:
->sourceMigration(...)
Ini menunjukkan kepada migrasi bahwa untuk memetakan bidang ini, migrasi lain harus dipenuhi terlebih dahulu. Saya percaya ini adalah "migrasi sekunder" yang Anda bicarakan. Mari kita gunakan region
pemetaan lapangan sebagai contoh di sini. Memecahnya ...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
Ini mengatakan bahwa wilayah kategori dalam basis data sumber dipetakan ke istilah kosakata wilayah. Seperti komentar TIP menyatakan dalam potongan pemetaan pemetaan bidang, ia mengasumsikan bahwa pemetaan dibuat berdasarkan field_names, tetapi karena kita bergantung pada migrasi sekunder seperti yang Anda katakan, kita perlu menentukan migrasi tempat bergantungnya dan memerintahkannya untuk gunakan tid sebagai ganti nama bidang.
Jadi cukup banyak untuk setiap tabel yang dinormalisasi yang Anda miliki di basis data sumber Anda, Anda akan menentukan migrasi untuk masing-masing, dan kemudian dalam pemetaan bidang yang relevan yang melibatkan tabel itu, Anda akan menentukan migrasi bergantung pada panggilan pemetaan lapangan Anda , serta deklarasi migrasi bergantung pada awal setiap migrasi.
Saya harap ini membantu. Saya sendiri tidak sepenuhnya memahami hal ini sehingga saya menggunakan pertanyaan ini sebagai kesempatan untuk meningkatkan pemahaman saya tentang bagaimana Migrasi menghubungkan basis data. Saat saya belajar sedikit lagi saya akan memperbarui jawaban saya sesuai.