滚动
9.13. 在 Drupal 中操作数据库
在开发 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()
的字段必须唯一,例如 nid
、uid
、tid
、fid
等实体 ID。如果指定的键不存在,则会插入一条新记录。
Delete 删除数据
$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();
以上就是 Drupal 数据库 API 的基本 CRUD 操作。如果你需要更多示例,请在评论中留言。在接下来的课程中,我们将学习如何在实际项目中使用这些自定义数据库查询。