logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动
03/10/2025, by Ivan

Drupal 的数据库层构建在 PHP 的 PDO 库 之上。PDO 提供了统一的面向对象 API 用于访问不同的数据库,但它并未为不同数据库使用的 SQL 方言提供抽象。

驱动程序

由于不同的数据库需要不同的交互方式,Drupal 的数据库层要求每种数据库类型都有一个驱动程序。驱动程序由一系列文件组成,这些文件位于 include/database/driver 目录中,其中 driver 是一个字符串,代表该驱动的唯一键。在大多数情况下,驱动键是数据库名称的小写形式,例如 “mysql”、“pgsql” 或 “mycustomdriver”。

每个驱动由几个类组成,这些类继承自数据库基础系统中的父类。这些特定于驱动的类可以重写任何行为,以便正确支持该类型的数据库。特定驱动的类总是以其父类名开头,后跟下划线,再后跟驱动名称。例如,MySQL 的 InsertQuery 版本名为 InsertQuery_mysql。

连接

连接是一个 DatabaseConnection 类的对象,该类继承自 PDO 类。Drupal 连接的每个数据库都关联一个连接对象。该连接对象必须为每个单独的驱动创建子类。

要访问(并在必要时打开)连接对象,请使用:

$database = \Drupal::database();
// 或者
$database = \Drupal::service('database');

如果服务尚不可用,可以使用 \Drupal\Core\Database\Database::getConnection() 获取数据库连接。

有关连接键和目标的更多信息,请参见 数据库配置文档页面

要访问当前活动连接,请使用:

$conn =  \Drupal\Core\Database\Database::getConnection();

这将获取活动连接的默认目标。

请注意,在绝大多数情况下,您无需直接请求连接对象。过程式封装会为您完成此操作。唯一需要直接访问连接对象的情况是,您需要对多个数据库进行复杂操作且不想更改活动数据库时。

要设置活动连接,请使用:

$conn = \Drupal\Core\Database\Database::setActiveConnection('external');

有关连接键和目标的详细信息,请参见下一节 数据库配置

查询

查询是将发送到数据库连接的 SQL 语句。数据库系统支持六种类型的查询:静态、动态、插入、更新、删除和合并。一些查询以 SQL 字符串模板(预处理语句)的形式编写,而另一些查询使用面向对象的查询构建器。“查询对象”指的是某种查询类型的查询构建器实例。

语句

语句对象是选择查询的结果。它始终为 DatabaseStatement 类型或其子类。DatabaseStatement 扩展了 PDOStatement 类。

Drupal 对所有查询都使用预处理语句。预处理语句是一个查询模板,在执行时会插入实际的值。可以将预处理语句看作是 SQL 函数的等价物,然后通过参数调用它。

在普通 PDO 中,需要显式准备一个语句对象,然后使用绑定到查询中占位符的特定值执行它。随后语句可以作为结果集迭代。实际上,语句和结果集是同义词,但仅在语句执行之后。

Drupal 不会直接暴露预处理语句。相反,模块开发人员会使用查询对象或一次性 SQL 字符串来执行查询,并返回该查询的语句对象。因此,“语句对象”和“结果集对象”在很大程度上是同义词。