Я сейчас работаю над той же проблемой, поэтому понимаю ваше замешательство. У вас много вопросов, но я думаю, что их можно объединить в единый вопрос:
Как модуль Migrate управляет миграцией нормализованной базы данных в установку Drupal?
Это определенно не просто, но вот мое понимание того, как это работает. Мы начнем сверху вниз (WineWineMigration) и будем задавать вопросы по ходу дела.
Мы начнем с просмотра кода в верхней части WineWineMigration
класса.
...
$this->dependencies = array('WineVariety', 'WineRegion',
'WineBestWith', 'WineUser', 'WineProducer');
...
Это говорит модулю Migrate, что для переноса содержимого Wine необходимо сначала выполнить зависимые миграции - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce.
Итак, мы узнали, что миграции могут зависеть от других миграций .
Далее у нас есть отображение между таблицей, которая в настоящее время содержит информацию о базовом вине, и узлом Drupal:
$this->map = new MigrateSQLMap($this->machineName,
array(
'wineid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Wine ID',
'alias' => 'w',
)
),
MigrateDestinationNode::getKeySchema()
);
Это довольно просто, поэтому, если вам нужно разъяснение, я предоставлю его.
Я собираюсь пропустить некоторые промежуточные вещи, которые на самом деле не имеют отношения к подключению различных категорий и винных объектов.
Теперь мы добираемся до полевых карт. Заметим:
// 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');
Посмотрите, где написано:
->sourceMigration(...)
Это указывает на миграцию, что для сопоставления этого поля сначала должна быть выполнена другая миграция. Я считаю, что это «вторичная миграция», о которой вы говорили. Давайте используем region
отображение поля в качестве примера здесь. Разбивая это ...
$this->addFieldMapping('migrate_example_wine_regions', 'region')
->sourceMigration('WineRegion')
->arguments(array('source_type' => 'tid'));
Это говорит о том, что регион категории в исходной базе данных сопоставлен с термином словаря региона. Как говорится в комментарии TIP в блоке кода сопоставлений полей, предполагается, что сопоставления сделаны на основе имен полей, но, как вы выразились, мы зависим от вторичной миграции, нам нужно указать миграцию, от которой она зависит, и дать ей указание: используйте приливы вместо имен полей.
Таким образом, в значительной степени для каждой нормализованной таблицы, имеющейся в вашей исходной базе данных, вы будете определять миграцию для каждой, а затем в соответствующих сопоставлениях полей, которые включают эти таблицы, вы будете указывать зависимые миграции в вызовах сопоставления полей. , а также декларация зависимых миграций в начале каждой миграции.
Надеюсь, это поможет. Я сам не до конца понимаю это, поэтому я использовал этот вопрос как возможность улучшить мое понимание того, как Migrate связывает базы данных. Поскольку я узнаю немного больше, я обновлю свой ответ соответственно.