logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动

创建数据库连接对象

03/10/2025, by Ivan

与数据库的交互应通过数据库连接对象进行。有几个场景需要注意:

1. 在过程式代码中,即 *.module、*.inc 或脚本文件中:
创建数据库连接对象实例的最佳方式是通过服务容器(Service Container)。

示例:

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

这将生成一个数据库连接对象,该对象被配置为连接到 settings.php 文件中定义的默认主数据库。

2. 出于历史和技术原因,\Drupal::database() 返回的类型是 \Drupal\Core\Database\Connection,因此它有时也被称为 $connection。
 
3. 在面向对象(OOP)的代码中:

  • 在某些情况下,数据库连接对象可能已经作为当前类的成员可用;例如,许多插件和服务都有 $this->database(或 $this->connection)作为数据库连接对象的成员。
  • 如果可能,请使用依赖注入(DI)来使用 @database 服务,或通过 $container->get('database') 注入数据库连接。
  • 如果无法使用(例如在类的静态方法中),请使用 \Drupal::database()。
  • 如果服务尚不可用,可以使用 \Drupal\Core\Database\Database::getConnection() 获取数据库连接。
  • 在单元测试中,我们没有加载核心或内置容器。单元测试通常不应访问数据库。需要数据库服务的单元测试应转换为核心测试。
  • 在核心类和功能测试中,我们可以使用 $this->container->get('database')。一些测试作者可能会发现,测试类引用的容器在功能测试请求期间不会与当前容器同步。在这种情况下,测试作者可以调用 $this->rebuildContainer(),然后再次访问 $this->container->get('database')。

使用其他数据库连接

如果您的站点使用多个数据库,要对非默认数据库运行查询,请使用 Database::getConnection()。例如:

$connection = \Drupal\Core\Database\Database::getConnection('default', 'other_database');

这将确保连接到 settings.php 中定义的数据库:

$databases['other_database']['default']