logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动

9.13. 在 Drupal 中操作数据库

16/10/2025, by Ivan

在开发 Drupal 模块时,执行数据库查询是很常见的操作。尽可能使用 entityQuery,但有时为了获取更复杂的数据,需要直接执行 SQL 查询。

你可以将此页面添加到书签,作为在 Drupal 中执行 MySQL 查询(select、insert、update、delete)的速查表。

Select 查询

获取单个值:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->addField('n', 'nid');
$query->condition('n.title', 'About Us');
$query->range(0, 1);
$nid = $query->execute()->fetchField();

获取数组形式的结果:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->range(0, 1);
$vegetable = $query->execute()->fetchAssoc();

你还可以使用 ->fetchObject()->fetchAll() 来以对象形式获取结果。

在查询中使用 LIKE:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->condition('n.title', $query->escapeLike('About') . '%', 'LIKE');
$vegetable = $query->execute()->fetchAllKeyed();

带 JOIN 的 SELECT 查询:

$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->addField('u', 'name');
$query->join('users_field_data', 'u', 'u.uid = n.uid');
$query->condition('n.type', 'page');
$vegetable = $query->execute()->fetchAllAssoc('nid');

下面是其他数据库操作(insert、update、upsert、delete)的示例。这些查询通常用于操作自定义表。但在使用自定义表之前,建议三思。如果可以,最好使用 Drupal API 或现有的贡献模块。如果确实需要直接对数据库执行自定义查询,以下是一些示例:

Insert 插入数据

$query = \Drupal::database()->insert('flood');
$query->fields([
  'event',
  'identifier'
]);
$query->values([
  'My event',
  'My identifier'
]);
$query->execute();

可以多次调用 values() 方法,以一次性插入多条记录。

Update 更新数据

$query = \Drupal::database()->update('flood');
$query->fields([
  'identifier' => 'My new identifier'
]);
$query->condition('event', 'My event');
$query->execute();

Upsert(存在则更新,不存在则插入)

$query = \Drupal::database()->upsert('flood');
$query->fields([
  'fid',
  'identifier',
]);
$query->values([
  1,
  'My identifier for upsert'
]);
$query->key('fid');
$query->execute();

key() 方法用于指定用于识别记录的唯一字段名。无需使用 condition(),直接用 key() 即可。用于 key() 的字段必须唯一,例如 niduidtidfid 等实体 ID。如果指定的键不存在,则会插入一条新记录。

Delete 删除数据

$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();

以上就是 Drupal 数据库 API 的基本 CRUD 操作。如果你需要更多示例,请在评论中留言。在接下来的课程中,我们将学习如何在实际项目中使用这些自定义数据库查询。