logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动

在 Drupal 7 中操作数据库 - 第9课 - 更新查询(UPDATE)

14/10/2025, by Ivan

更新查询应始终使用查询构造器(Query Builder)。不同的数据库对 LOB(Large Object,如 MySQL 中的 TEXT)和 BLOB(Binary Large Object)字段有各自的处理方式,因此需要在数据库抽象层中为每个驱动实现特定的处理逻辑。

更新查询从函数 db_update() 开始:

<?php
$query = db_update('node', $options);
?>

通过创建此更新查询对象,我们可以修改表 node 中的一条或多条记录。请注意,不需要使用花括号包裹表名,查询构造器会自动处理。

更新查询对象使用 Fluent API(链式调用),因此除 execute() 外的所有方法都会返回查询对象自身,从而支持方法链调用。在大多数情况下,这意味着查询不需要存储为变量。

更新查询通常由一个字段键值对集合(要更新的字段和对应的新值)以及一组 WHERE 条件组成。WHERE 的完整结构将在后续课程中详细讲解,这里仅作简单介绍。

典型的更新查询示例如下:

<?php
/* 这个示例展示了如何更新表 node 中的记录 */
$num_updated = db_update('node')
  ->fields(array(
    'uid' => 5,
    'status' => 1,
  ))
  ->condition('created', REQUEST_TIME - 3600, '>=')
  ->execute();
?>

该示例等价于以下 SQL 查询:

UPDATE {node} SET uid=5, status=1 WHERE created >= 1221717405;

上面的示例将更新过去一小时内创建的所有节点记录,将字段 uid 设置为 5,并将字段 status 设置为 1。

fields() 方法接收一个关联数组,用于定义需要更新的字段及其新值。与插入查询不同,UpdateQuery::fields() 仅支持关联数组。数组中字段的顺序或方法调用顺序无关紧要。

execute() 方法返回被更新的记录数量。请注意,这个数量并不一定等于所有符合 WHERE 条件的记录数量。例如,如果某些节点的 uid = 5status = 1,它们虽然满足 WHERE 条件,但由于更新后的值与原值相同,这些记录不会被修改。因此,更新查询返回的受影响行数不一定反映当前所有符合条件的记录数量。