我正在开发一个将网站从asp.net迁移到drupal架构的项目。但网站内容非常分层,实体之间有很多引用。
例如:每个内容属于一个类别,每个类别属于另一个类别部分。现在甚至可能存在另一层次的层次结构。
我计划利用迁移模块迁移数据库内容并通过节点引用字段链接迁移的节点。
但是我陷入了迁移模块的困境,因为我找不到在任何地方迁移节点引用字段的方法......
任何人都可以帮我解决这个问题......
答案 0 :(得分:3)
实际上,它在2012年似乎并不那么难。是的,您必须跟踪源ID与导入ID,但迁移模块会在一个整洁的小表中为您执行此操作。您可以在源查询中加入该表,并使用.. referenced节点的nid更新节点引用字段。当然,引用的节点应该已经导入了。如果它们不是,您可以稍后运行“更新”,并根据后面的导入输入引用的nids。在实践中:
$query = Database::getConnection(
'default', 'mysourcedb'
)->select(
'mysourcetable','source'
)->fields('source', array(
'id',
'title',
'whatever'
'rel_rec_id'
)
);
$query->leftJoin('migrate_map_relimport','relmap','relmap.sourceid1=source.rel_rec_id');
$query->addField('relmap','destid1','rel_node_id');
上面的代码假设你有一个'mysourcedb',其中有一个'mysourcetable',它引用了'rel_rec_id',还有一个名为RelImport的导入导入了rel_rec_id引用的rel表;它应该已经运行(或者在运行其他更新之前运行)。在获得RelImport类以确保表存在后执行迁移状态。
为了能够连接到'migrate_map_relimport'表,请确保将映射表写入源数据库,而不是drupal数据库。这并不总是必要的,但现在是:
$this->map = new MigrateSQLMap(
$this->machineName,
array(
'id' => array(
'type' => 'int',
'unsigned' => true,
'not null' => true,
'alias' => 'source'
)
),
MigrateDestinationNode::getKeySchema(),
'mysourcedb' // connection to use to write map tables
);
最后,将检索到的rel_node_id分配给您的节点引用:
$this->addFieldMapping( 'field_rel_node', 'rel_node_id' );
是的,这是火箭科学.YMMV
* - 矛
答案 1 :(得分:1)
据我所知,您无法在迁移模块中完全执行此操作。你必须直接在MySQL中运行一些查询。
基本上,您必须在每种内容类型中创建一个额外字段以容纳其遗留ID,并为每个遗留参考创建一个附加字段(除了实际的nodereference字段)。将所有数据加载到内容类型中(将nodereference字段留空)。然后,一旦加载了所有实体,就运行mysql查询以根据遗留ID和旧参考字段填充节点参考字段。完成后,您可以安全地删除这些旧字段。
不是最优雅的解决方案,但我已多次使用它。
注意事项: *这是Drupal 6; Drupal 7的字段实现完全不同AFAIK。 *对于非常大的迁移,您可能希望通过MySQL进行遗留字段删除。
祝你好运。迁移是一项肮脏的业务。答案 2 :(得分:1)
您还可以查看Content Migrate模块的代码(https://drupal.org/node/1144136上的更多信息)。它用于将D6内容构建工具包(CCK)内容迁移到D7字段,并且它已与References模块集成。
由于您来自ASP.net网站而不是D6网站,因此它无法满足您的需求,但它可能会提供一些线索。
答案 3 :(得分:0)
以下链接可能很有趣:http://www.lullabot.com/articles/drupal-data-imports-migrate-and-table-wizard#comment-6974。
答案 4 :(得分:0)
不完全是你问的问题,但这对我有用: http://drupal.org/node/1013506