我正在处理同一个问题,因此我了解您的困惑。您有很多问题,但是我认为可以将它们总结为一个单一的问题:
迁移模块如何处理将规范化数据库迁移到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注释在字段映射代码块中指出的那样,它假定映射是基于field_names进行的,但是由于我们依赖于您所说的二次迁移,因此我们需要指定它所依赖的迁移并指示它使用提示而不是字段名称。
因此,对于源数据库中存在的每个规范化表,几乎都要为每个表指定迁移,然后在涉及这些表的相关字段映射中,将在字段映射调用中指定相关迁移,以及每次迁移开始时的从属迁移声明。
我希望这有帮助。我本人对此并不完全了解,因此我以此为契机,加深了对Migrate如何关联数据库的理解。随着我学到更多,我将相应地更新答案。