
在您开始之前
在开始升级之前,请确保您已阅读本指南的前几页:
请确保您正在使用最新版本的 Drupal 8。您可以在 Drupal 8 站点的状态报告页面 (/admin/reports/status) 查看版本信息。迁移工具仍在开发中,因此请保持 Drupal 核心更新,以确保获得最新的迁移改进。
请确保您的 Drupal 8 站点启用了以下核心模块:


Drush 是 Drupal 的命令行外壳和脚本接口。使用 Drush 升级到 Drupal 8 是使用浏览器用户界面的替代方案。对于复杂站点的迁移,使用 Drush 升级到 Drupal 8 非常有用,因为它允许逐个运行迁移并支持回滚。
使用 Composer 安装 Drush
Drupal 8 站点可以使用 Composer 构建。如果您决定使用 drupal-composer/drupal-project 作为 Composer 项目模板,那么您已经拥有 Drush,因为它在项目的 composer.json 文件中被定义为依赖。
如果您的 Composer 项目中没有将 Drush 定义为依赖,可以通过以下命令行安装 Drush:
composer require drush/drush
注意:现在请使用 Drush 9


Drupal 6 到 8
聚合器分类
在 Drupal 8 中不再存在聚合器分类的概念,因此它们不会被迁移到 Drupal 8。
允许的协议
Drupal 8 现在将协议保存在容器参数 “filter_protocols” 中,因此,如果您更改了变量 “filter_allowed_protocols”,请将其输入到 services.yml 文件中。
允许的分类参考字段词汇表
在 Drupal 6 中,某个词汇表适用的内容类型列表是在词汇表设置中定义的。在 Drupal 8 中,允许的词汇表可以在分类术语引用字段的设置中定义。此设置目前不会迁移,这意味着在 Drupal 8 中可以引用所有词汇表。您可以在升级后手动编辑 Drupal 8 中的分类术语引用字段设置,并选择允许的词汇表。
[已修复] 日期格式
仅迁移默认的短、中、长三种格式。所有其他格式都有备用格式,并且需要在迁移后重新配置。


创建你的初始迁移
- 使用 drush migrate-upgrade --configure-only 创建迁移,如 使用 Drush 升级 部分所述。
- 确保你有一个 config/sync 目录,下一步会写入其中。
- 使用 drush config:export 导出迁移。
- 创建你自己的迁移模块。
- 从 config/sync 目录中复制你要使用的 YML 文件到新自定义模块的 config/install 目录,并根据需要编辑它们以删除 uuid 值并修改 id、group、label 等。
- 从 config/sync 复制 migrate_plus.migration_group.migrate_drupal_7.yml 文件到新自定义模块的 config/install 目录,并将其命名为 migrate_plus.migration_group.your_module.yml。这个分组文件是必须的,因为它包含数据库设置。


Drupal 的核心模块「Migrate Drupal」提供了从一个 Drupal 版本迁移到另一个 Drupal 版本的 API 支持,而「Migrate Drupal UI」则提供了一个简单的用户界面,用于从旧版本 Drupal 升级。
从 Drupal 6 到 Drupal 8 以及从 Drupal 7 到 Drupal 8 的更新在单语言站点上是稳定的。多语言站点的更新路径尚未完成。请参阅 从多语言 Drupal 6 升级到 Drupal 8 以获取有关 Drupal 6 - Drupal 8 多语言升级的简要信息,以及 多语言迁移的 meta 问题 以查看多语言迁移问题的清单。目前有几种方式来确保 D6-D8 和 D7-D8 更新路径的稳定性。


动态查询是指由 Drupal 动态创建的查询,而不是以显式查询字符串的形式提供的查询。所有插入、更新、删除和合并查询都必须是动态的。选择查询既可以是静态的,也可以是动态的。因此,「动态查询」通常是指动态的 Select 查询。
注意:在 90% 的 select 查询用例中,你会使用静态查询。如果在性能关键路径上,应出于性能考虑使用 query() 而不是 select()。仅当查询的部分内容不同(例如:根据上下文动态添加 WHERE 条件),或者查询必须可被更改时,才应使用动态查询。
所有动态创建的查询都是通过从相应的数据库连接对象请求查询对象来生成的。与静态查询类似,在绝大多数情况下都可以使用过程式封装来生成查询对象。但后续的查询指令则以调用查询对象的方法的形式存在。
动态选择查询通过 select() 方法启动,如下所示:


Select 查询构建器支持在字段列表中使用表达式。表达式示例包括「年龄字段的两倍」、「所有 name 字段的数量」以及标题字段的子字符串。请记住,许多表达式可能会使用 SQL 函数,而并非所有 SQL 函数都在所有数据库中标准化。模块开发者必须确保只使用与数据库兼容的表达式。(参见 函数和运算符列表)
要向查询中添加表达式,请使用 addExpression() 方法。


添加字段
要在 Select 查询中添加字段,请使用 addField() 方法:
$title_field = $query->addField('n', 'title', 'my_title');
上面的代码会指示查询从带有别名「n」的表中选择「title」字段,并将其赋予别名「my_title」。如果没有指定别名,它会自动生成。在绝大多数情况下,生成的别名就是字段名。例如这里将是「title」。如果该别名已存在,别名将变为表名加字段名,例如「n_title」。如果这个别名仍然存在冲突,则会在别名后追加一个计数器,直到找到未使用的别名,例如「n_title_2」。
请注意,如果你自己创建并构建查询但没有指定别名,而默认别名又不可用,那么你的代码几乎可以肯定有问题。然而,如果你在编写 hook_query_alter() 的实现时,你无法确切知道哪些别名已经被使用,因此你始终应当使用生成的别名。
添加多个字段
要选择多个字段,请多次调用 addField(),顺序随意。请注意,在大多数情况下字段的顺序并不重要,如果顺序很重要,那通常说明模块的业务逻辑存在缺陷。
