滚动
创建数据库连接对象
与数据库的交互应通过数据库连接对象进行。有几个场景需要注意:
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']