3

我正在做一个将网站从 asp.net 迁移到 drupal 架构的项目。但是站点内容非常分层,实体之间有很多引用。

例如:每个内容属于一个类别,每个类别属于另一个类别部分。现在甚至可能还有另一个层次结构。

我计划使用 migrate 模块来迁移数据库内容并通过节点引用字段链接迁移的节点。

但是我被迁移模块卡住了,因为我找不到在任何地方迁移节点引用字段的方法......

谁能帮我解决这个...

4

5 回答 5

3

实际上,在 2012 年似乎并没有那么难。是的,您必须跟踪源 ID 与导入 ID,但是 migrate 模块在一个整洁的小表格中为您完成了这项工作。您可以在源查询中加入该表,并使用 .. 引用节点的 nid 更新节点引用字段。当然,引用的节点应该已经被导入。如果它们不是,您可以稍后运行“更新”并根据后者的导入输入引用的 nid。在实践中:

$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-status 以确保表存在。

为了能够连接到 '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

*-派克

于 2012-10-12T10:16:15.823 回答
1

据我所知,您将无法完全在 migrate 模块中执行此操作。您必须直接在 MySQL 中运行一些查询。

本质上,您必须在每种内容类型中创建一个额外的字段来容纳它们的旧 ID,并为每个旧引用创建一个附加字段(除了实际的 nodereference 字段)。将所有数据加载到内容类型中(将 nodereference 字段留空)。然后,一旦加载了所有实体,就运行 mysql 查询以根据旧 ID 和旧引用字段填充节点引用字段。完成后,您可以安全地删除这些旧字段。

不是最优雅的解决方案,但我已经使用过很多次了。

注意事项:* 这是针对 Drupal 6 的;Drupal 7 的字段实现与 AFAIK 完全不同。* 对于非常大的迁移,您可能希望通过 MySQL 删除遗留字段。

祝你好运。移民是一项肮脏的生意。

于 2011-02-03T15:07:57.847 回答
1

您还可以查看 Content Migrate 模块的代码(更多信息参见 https://drupal.org/node/1144136)。它用于将 D6 内容构建工具包 (CCK) 内容迁移到 D7 字段,并且已与参考模块集成。

由于您来自 ASP.net 站点而不是 D6 站点,因此它不会立即执行您需要的操作,但它可能会提供一些线索。

于 2012-04-20T17:14:59.453 回答
0

这是一个可能很有趣的链接:http ://www.lullabot.com/articles/drupal-data-imports-migrate-and-table-wizard#comment-6974 。

于 2011-02-03T10:30:51.590 回答
0

不完全是您要问的,但这对我很有用:http: //drupal.org/node/1013506

于 2013-03-12T18:43:44.250 回答