我们正在尝试使用核心迁移模块将内容从外部数据源迁移到Drupal 8。这是正在迁移的数据的简化示例:
id resourceId articleId version title body
---------------------------------------------------------------------------
1 10 10 1 Page title Page content
2 10 10 1.1 Page title Page content
3 10 10 1.2 Page title Page content
4 11 11 1 Page title Page content
5 11 11 1.1 Page title Page contentid字段是惟一的标识符,是getIds()方法中设置的字段,正如您可以看到的那样,resourceId和articleId更像是要迁移到Drupal中的节点id的首选表示形式。
据我理解,在阅读了migrate_example模块之后,query()方法只能返回一行;因此,当我们的迁移运行时,所有这些记录都是作为新节点迁移的,而在以前的数据库中,这些记录只是对一段内容的修订。
如果我们打算只返回query()方法中的单个行,那么只迁移每一段内容的最新版本的最佳方法是什么?
我的第一次尝试是尝试在processRow()方法中实现这一点,但是如果迁移是逐行遍历表,那么如果下一行是最近的版本,那么如何删除/更新前一行呢?
我们可以选择先在表上运行自己的脚本,过滤掉所有最新版本,然后运行迁移脚本,但是我想知道是否有一种方法可以使用Drupal中的核心模块来实现这一点。
提前谢谢。
发布于 2019-11-27 13:32:06
是的,这个部分根本没有记录下来,我现在也遇到了问题,所以我是如何解决这个问题的:
当您想要迁移有修订版的内容时,您需要用entity:node插件迁移第一个版本,然后用entity_revision:node迁移下一个版本。您不做任何其他事情,只需更改目标插件,并且在迁移修订时,将nid值设置为节点的第一个版本。因此,您保留了主体、文件和其他字段,只需添加nid字段,因此修改插件将知道将内容放在何处。至少从yml部分来说是这样的。
从源代码中,有两个用于节点插件,其中只列出要迁移的内容的第一个版本,另一个用于列出除了第一个版本之外的所有内容,您还有一个新列,其中包含每个修订版的第一个版本的ID。
如果将当前的发布一个迁移到节点表中,而将其余的迁移到修订中,则ID、修订的顺序和其他一些事情都会被搞砸。至少我的案子是这样。
根据代码(不是100%完全完成,只是主要部分):
migrate_plus.migration.node.yml:
id: my_node
source:
plugin: my_node
process:
title: title
body: body
langcode:
plugin: default_value
default_value: "und"
status:
plugin: default_value
default_value: 1
#other fields except nid.
destination:
plugin: entity:node查询源插件(id = my_node):
SELECT id, title, body FROM content WHERE version = 1
在getIds()中,id是唯一的id。
migrate_plus.migration.node_revision.yml:
id: my_node_revision
source:
plugin: my_node_revision
process:
nid:
plugin: migration_lookup
migration:
- my_node
- my_node_revision
source: first_version
title: title
body: body
langcode:
plugin: default_value
default_value: "und"
status:
plugin: default_value
default_value: 1
#other fields.
destination:
plugin: entity_revision:node查询源插件(id = my_node_revision):
SELECT first_ver.id AS first_version, c.id, c.title, c.body FROM content c
INNER JOIN (
SELECT * FROM content c
WHERE version = 1
) first_ver ON c.resourceId = first_ver.resourceId AND c.articleId = first_ver.articleId
WHERE c.version <> 1在getIds()中,id是唯一的id。
上面的例子将为内容提供新的id。
编辑:请注意,这个答案中的示例是从汇流数据库迁移到drupal,因此与正常的drupal迁移略有不同。另外,如果您查看位于这里的entity_revision:node插件:core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php,您会注意到有两种方法可以做到这一点。
( A)提供订正身份证。
( B)不提供订正证明。
当您不提供修订ID时,当您添加新的修订时,它将始终使最新添加的修订成为最新的内容版本。(示例yml和源代码如下所示)
当您提供修订ID时,首先需要将当前版本添加到节点表中,然后添加所有修订并提供修订ID,在这种情况下,它不会将最后添加的修订作为最新的内容版本。
https://drupal.stackexchange.com/questions/221701
复制相似问题