Şu anda aynı sorun üzerinde çalışıyorum, bu yüzden karışıklığınızı anlıyorum. Çok fazla sorunuz var, ancak bence bunlar tek bir soru olarak özetlenebilir:
Migrate modülü, normalize edilmiş bir veritabanının Drupal kurulumuna geçirilmesini nasıl ele alır?
Kesinlikle basit değil, ama işte nasıl çalıştığını anladım. Aşağıdan başlayarak (WineWineMigration) başlayacağız ve giderken sorular soracağız.
WineWineMigration
Sınıfın en üstündeki koda bakarak başlıyoruz .
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
Bu Migrate modülüne Wine içeriğinizi taşımak için önce bağımlı geçişlerin (WineVariety, WineRegion, WineBestWith, WineUser, WineProduce) tamamlanması gerektiğini bildirir.
Burada öğrendiğimiz şey, göçlerin diğer göçlere bağlı olabileceğidir .
Sonra şu anda temel şarap bilgilerini tutan tablo ile Drupal düğümü arasındaki eşleme var:
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
Bu oldukça basittir, bu yüzden açıklığa ihtiyacınız varsa bunu sağlayacağım.
Çeşitli kategorileri ve şarap nesnelerini bağlamaya gerçekten uygun olmayan bazı geçici şeyleri atlayacağım.
Şimdi saha haritalarına geçiyoruz. Gözlemek:
// 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');
Nerede yazdığına bakın:
->sourceMigration(...)
Bu, bu alanı eşleştirmek için önce başka bir taşıma işleminin yerine getirilmesi gerektiğini gösterir. Bunun bahsettiğiniz "ikincil göç" olduğuna inanıyorum. region
Alan eşlemesini burada örnek olarak kullanalım . Yıkılıyor ...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
Bu, kaynak veritabanındaki kategori bölgesinin bir bölge kelime terimiyle eşlendiğini belirtir. TIP yorumu alan eşleme kodu yığınında belirtildiği gibi, eşlemelerin alan_adı temel alınarak yapıldığını varsayar, ancak koyduğunuzda ikincil bir geçişe bağımlı olduğumuz için, bağımlı olduğu taşımayı belirtmeli ve alan adları yerine tids kullanın.
Kaynak veritabanınızdaki normalleştirilmiş her tablo için hemen hemen her biri için bir geçiş belirleyeceksiniz ve daha sonra bu tabloları içeren ilgili alan eşlemelerinde alan eşleme çağrılarınızda bağımlı geçişleri belirleyeceksiniz ve her bir göçün başlangıcındaki bağımlı göç beyanı.
Umarım bu yardımcı olur. Bunu kendim tam olarak anlamıyorum, bu yüzden bu soruyu Migrate'ın veritabanlarıyla nasıl ilişkili olduğu konusundaki anlayışımı geliştirmek için bir fırsat olarak kullandım. Biraz daha öğrendiğimde cevabımı buna göre güncelleyeceğim.