Estou trabalhando no mesmo problema agora, então entendo sua confusão. Você tem muitas perguntas, mas acho que elas podem ser resumidas em uma pergunta singular:
Como o módulo Migrate lida com a migração de um banco de dados normalizado para uma instalação do Drupal?
Definitivamente, não é simples, mas eis o meu entendimento de como funciona. Começaremos do topo (WineWineMigration) descendo e fazendo perguntas à medida que avançamos.
Começamos olhando para o código na parte superior da WineWineMigration
classe.
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
Isso informa ao módulo Migrate que, para migrar o conteúdo do Wine, as migrações dependentes - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - devem ser concluídas primeiro.
Então, o que aprendemos aqui é que as migrações podem depender de outras migrações .
A seguir, temos o mapeamento entre a tabela que atualmente contém as informações básicas do vinho e o nó Drupal:
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
Isso é bastante direto, portanto, se você precisar de esclarecimentos, eu o fornecerei.
Vou pular algumas coisas provisórias que não são realmente pertinentes para conectar as várias categorias e objetos de vinho.
Agora chegamos aos mapeamentos de campo. Observar:
// 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');
Veja onde diz:
->sourceMigration(...)
Isso indica para a migração que, para mapear esse campo, outra migração deve ser satisfeita primeiro. Eu acredito que esta é a "migração secundária" de que você falou. Vamos usar o region
mapeamento de campo como o exemplo aqui. Quebrando tudo ...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
Isso indica que a região da categoria no banco de dados de origem é mapeada para um termo de vocabulário da região. Como o comentário TIP declara no pedaço de código dos mapeamentos de campo, ele pressupõe que os mapeamentos sejam feitos com base em field_names, mas como dependemos de uma migração secundária, como você diz, precisamos especificar a migração da qual depende e instruí-la a use marés em vez de nomes de campos.
Portanto, para praticamente todas as tabelas normalizadas que você possui no banco de dados de origem, você especificará uma migração para cada uma delas e, nos mapeamentos de campo relevantes que envolvem essas tabelas, especificará migrações dependentes nas chamadas de mapeamento de campo , bem como a declaração de migrações dependentes no início de cada migração.
Eu espero que isso ajude. Eu mesmo não entendo completamente, então usei essa pergunta como uma oportunidade para aprimorar meu entendimento de como o Migrate relaciona bancos de dados. À medida que aprender um pouco mais, atualizarei minha resposta de acordo.