首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从外部数据源迁移修订

从外部数据源迁移修订
EN

Drupal用户
提问于 2016-11-29 11:06:15
回答 1查看 617关注 0票数 2

我们正在尝试使用核心迁移模块将内容从外部数据源迁移到Drupal 8。这是正在迁移的数据的简化示例:

代码语言:javascript
复制
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 content

id字段是惟一的标识符,是getIds()方法中设置的字段,正如您可以看到的那样,resourceId和articleId更像是要迁移到Drupal中的节点id的首选表示形式。

据我理解,在阅读了migrate_example模块之后,query()方法只能返回一行;因此,当我们的迁移运行时,所有这些记录都是作为新节点迁移的,而在以前的数据库中,这些记录只是对一段内容的修订。

如果我们打算只返回query()方法中的单个行,那么只迁移每一段内容的最新版本的最佳方法是什么?

我的第一次尝试是尝试在processRow()方法中实现这一点,但是如果迁移是逐行遍历表,那么如果下一行是最近的版本,那么如何删除/更新前一行呢?

我们可以选择先在表上运行自己的脚本,过滤掉所有最新版本,然后运行迁移脚本,但是我想知道是否有一种方法可以使用Drupal中的核心模块来实现这一点。

提前谢谢。

EN

回答 1

Drupal用户

发布于 2019-11-27 13:32:06

是的,这个部分根本没有记录下来,我现在也遇到了问题,所以我是如何解决这个问题的:

当您想要迁移有修订版的内容时,您需要用entity:node插件迁移第一个版本,然后用entity_revision:node迁移下一个版本。您不做任何其他事情,只需更改目标插件,并且在迁移修订时,将nid值设置为节点的第一个版本。因此,您保留了主体、文件和其他字段,只需添加nid字段,因此修改插件将知道将内容放在何处。至少从yml部分来说是这样的。

从源代码中,有两个用于节点插件,其中只列出要迁移的内容的第一个版本,另一个用于列出除了第一个版本之外的所有内容,您还有一个新列,其中包含每个修订版的第一个版本的ID。

如果将当前的发布一个迁移到节点表中,而将其余的迁移到修订中,则ID、修订的顺序和其他一些事情都会被搞砸。至少我的案子是这样。

根据代码(不是100%完全完成,只是主要部分):

migrate_plus.migration.node.yml:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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,在这种情况下,它不会将最后添加的修订作为最新的内容版本。

票数 1
EN
页面原文内容由Drupal提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://drupal.stackexchange.com/questions/221701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档