47 更新查询

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

    更新查询必须使用一个查询构建器对象。对于LOB (大对象比如MySQL中的TEXT) BLOB二进制大对象)字段,某些数据库需要特殊处理,所以我们需要一个抽象层,从而允许独立的数据库驱动,按照它们自己的要求实现自己的特殊处理。

    更新查询使用db_update()函数作为开始,如下所示:

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

    上述代码创建了一个更新查询对象,它将修改节点表中的一个或多个记录。注意这里没有为表名使用花括号,这是因为查询构建器能够自动的处理这一点。

    更新查询对象使用的API具有链式特性。也就是说,所有的方法(除了execute()),返回的都是查询对象本身,这样,这些方法调用就可以采用链式结构了。在大多数情况下,这也就意味着,我们不需要将查询对象保存在一个变量中了。

    更新查询的结构是非常简单的,它包含一个要设置的键值对儿集合,还有一个WHERE语句。有关WHERE语句的结构,我们在这里只是简单的说明,更详细的介绍可参看后面的条件语句一节。

    典型的更新查询如下所示。

<?php
$num_updated db_update('node')
  ->fields(array(
    'uid' => 5,
    'status' => 1,
  ))
  ->condition('created'REQUEST_TIME 3600'>=')
  ->execute();
?>

    上面的查询将会更新节点表中最近一小时内创建的所有记录,把它们的uid字段设置为5,把status字段设置为1。fields()方法中的参数是单个关联数组,用来指定要设置哪些字段以及对应的值,当指定的条件满足时,就会进行相应更新。注意,与插入查询不同,UpdateQuery::fields()只接收一个关联数组。还有,数组中字段的顺序,以及方法的调用顺序,与结果无关。

    上面的代码就等价于执行下面的查询:

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

    execute()将返回查询影响到的记录总数。注意,影响到的与匹配到的通常不一致。在上面的查询中,如果一个已有记录,它的uid为5,status为1,并且满足条件语句,此时它就是匹配的,但是由于它里面的数据没有被修改,也就是它没有被查询影响到,因此不会记入到返回值中。作为一个副作用,这使得更新查询无法判定一个记录是否存在。


Drupal版本: