Estoy trabajando en el mismo problema ahora, así que entiendo tu confusión. Tienes muchas preguntas, pero creo que se pueden resumir en una pregunta singular:
¿Cómo maneja el módulo Migrate la migración de una base de datos normalizada a una instalación de Drupal?
Definitivamente no es sencillo, pero aquí está mi comprensión de cómo funciona. Comenzaremos desde arriba (WineWineMigration) bajando y haremos preguntas a medida que avanzamos.
Comenzamos mirando el código en la parte superior de la WineWineMigration
clase.
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
Esto le dice al módulo Migrate que para migrar su contenido de Wine, las migraciones dependientes - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - deben completarse primero.
Entonces, lo que hemos aprendido aquí es que las migraciones pueden depender de otras migraciones .
A continuación tenemos el mapeo entre la tabla que actualmente contiene la información del vino base y el nodo Drupal:
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
Esto es bastante sencillo, por lo que si necesita una aclaración, se la proporcionaré.
Voy a omitir algunas cosas provisionales que no son realmente pertinentes para conectar las diferentes categorías y objetos de vino.
Ahora llegamos a las asignaciones 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');
Mira donde dice:
->sourceMigration(...)
Esto indica a la migración que para mapear este campo, otra migración debe ser satisfecha primero. Creo que esta es la "migración secundaria" de la que hablaste. Usemos el region
mapeo de campo como el ejemplo aquí. Desglosándolo ...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
Esto dice que la región de categoría en la base de datos de origen se asigna a un término de vocabulario de región. Como el comentario TIP indica en el fragmento de código de asignaciones de campo, se supone que las asignaciones se realizan en base a los nombres de campo, pero como dependemos de una migración secundaria como la pones, necesitamos especificar la migración de la que depende e indicarle use tids en lugar de nombres de campo.
Entonces, para cada tabla normalizada que tenga en su base de datos de origen, va a especificar una migración para cada una, y luego, en las asignaciones de campo relevantes que involucran esas tablas, especificará migraciones dependientes en sus llamadas de asignación de campo , así como la declaración de migraciones dependientes al comienzo de cada migración.
Espero que esto ayude. No lo entiendo completamente, así que utilicé esta pregunta como una oportunidad para mejorar mi comprensión de cómo Migrate relaciona las bases de datos. A medida que aprenda un poco más, actualizaré mi respuesta en consecuencia.