Ich arbeite gerade an demselben Problem, damit ich Ihre Verwirrung verstehe. Sie haben viele Fragen, aber ich denke, sie lassen sich zu einer einzigen Frage zusammenfassen:
Wie behandelt das Migrate-Modul die Migration einer normalisierten Datenbank in eine Drupal-Installation?
Es ist definitiv nicht einfach, aber hier ist mein Verständnis, wie es funktioniert. Wir beginnen von oben (WineWineMigration) und stellen Fragen, während wir gehen.
Wir beginnen mit einem Blick auf den Code oben in der WineWineMigration
Klasse.
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
Dies teilt dem Migrationsmodul mit, dass zum Migrieren Ihres Wine-Inhalts die abhängigen Migrationen - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - zuerst abgeschlossen werden müssen.
Wir haben hier also gelernt, dass Migrationen von anderen Migrationen abhängig sein können .
Als nächstes haben wir die Zuordnung zwischen der Tabelle, die derzeit die Basisweininformationen enthält, und dem Drupal-Knoten:
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
Dies ist ziemlich einfach. Wenn Sie eine Klärung benötigen, werde ich diese bereitstellen.
Ich werde einige vorläufige Dinge überspringen, die nicht wirklich relevant sind, um die verschiedenen Kategorien und Weinobjekte miteinander zu verbinden.
Nun kommen wir zu den Feldzuordnungen. Beobachten:
// 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');
Sehen Sie, wo es heißt:
->sourceMigration(...)
Dies zeigt der Migration an, dass zum Zuordnen dieses Felds zuerst eine andere Migration durchgeführt werden muss. Ich glaube, dies ist die "sekundäre Migration", von der Sie gesprochen haben. Verwenden wir hier die region
Feldzuordnung als Beispiel. Brechen sie ab...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
Dies besagt, dass die Kategorieregion in der Quellendatenbank einem Regionsvokabularbegriff zugeordnet ist. Wie im TIP-Kommentar im Codeblock für Feldzuordnungen angegeben, wird davon ausgegangen, dass Zuordnungen auf der Grundlage von Feldnamen vorgenommen werden. Da wir jedoch von einer sekundären Migration abhängig sind, müssen Sie die Migration angeben, von der sie abhängig sind, und sie anweisen Verwenden Sie Gezeiten anstelle von Feldnamen.
So ziemlich für jede normalisierte Tabelle, die Sie in Ihrer Quellendatenbank haben, geben Sie für jede eine Migration an, und dann geben Sie in den relevanten Feldzuordnungen, die diese Tabellen betreffen, abhängige Migrationen in Ihren Feldzuordnungsaufrufen an sowie die Erklärung der abhängigen Migrationen zu Beginn jeder Migration.
Ich hoffe das hilft. Ich verstehe das selbst nicht ganz und habe diese Frage als Gelegenheit genutzt, um mein Verständnis für die Beziehung zwischen Migrate und Datenbanken zu verbessern. Wenn ich etwas mehr lerne, werde ich meine Antwort entsprechend aktualisieren.