滚动
在 Drupal 7 中操作数据库 - 第9课 - 更新查询(UPDATE)
更新查询应始终使用查询构造器(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 = 5 且 status = 1,它们虽然满足 WHERE 条件,但由于更新后的值与原值相同,这些记录不会被修改。因此,更新查询返回的受影响行数不一定反映当前所有符合条件的记录数量。