DRUPAL8模块开发 - DRUPAL8数据库API - 更新查询

翻译者:长风Drupal开发团队(成都长风云信息技术有限公司)

 

Drupal开发中,更新查询必须始终使用查询生成器对象。某些数据库需要特殊处理LOB(大对象,如文本对MySQL)和BLOB(二进制大对象)的领域,所以一个抽象层必须允许个人数据库驱动程序执行任何特殊处理要求。

更新查询通过使用update()方法开始,如下:

$query = $connection->update('mytable', $options);

 

这将创建一个更新的查询对象,修改一个或多个记录的节点表。注:括号不需要在表名作为查询生成器,自动处理。

更新查询对象使用Fluent API。那就是,所有的方法(除了execute())返回查询对象本身允许方法调用被。在许多情况下,这意味着查询对象将不需要保存到一个变量在所有。

更新查询的概念是很简单的,由一组键/值对集和WHERE子句。WHERE子句的详细节中的条件从句的完整结构,而只会感动于这里。

典型的更新查询如下。

 

$num_updated = $connection->update('mytable')

->fields([

'field1' => 5,

'field2' => 1,

])

->condition('created', REQUEST_TIME - 3600, '>=')

->execute();

 

上面的查询将更新在最后一个小时内创建的MyTABLE表中的所有记录,并将它们的Field1字段设置为5和Field2字段至1。FieldSe()方法采用一个单一的关联数组,它指定在满足指定条件时将哪些字段设置为什么值。注意,与插入查询不同,UpdateQuery::fields() 只接受数组。此外,数组中的字段顺序和调用方法的顺序是无关的。

上面的例子是等效于下面的查询:

UPDATE {mytable} SET field1=5, field2=1 WHERE created >= 1221717405;

 

Drupal中,execute()方法将返回受查询影响的行数。值得注意的是,受影响的不匹配的相同。在上面的查询中,已有字段5和字段1的现有记录将被匹配,但是由于它中的数据不改变,它将不受查询的影响,因此不被计算在返回值中。作为副作用,这使得更新查询对于确定给定的记录是否已经存在无效。

<?php

$query = $connection->update('mytable');// Conditions etc.

$affected_rows = $query->execute();

?>

执行条件

$query = $connection->update('mytable')

->condition('module', 'my_module')

->where(

'SUBSTR(delta, 1, 14) <> :module_key',

['module_key' => 'my_module-key_']

)

->expression('delta', "REPLACE(delta, 'my_module-other_', 'my_module-thing_')")

->execute();

在条件中使用字符串函数

$query = $connection->update('mytable')

->condition('module', 'my_module')

->condition('SUBSTR(delta, 1, 14)', 'my_module-key_', '<>') // causes error.

->expression('delta', "REPLACE(delta, 'my_module-other_', 'my_module-thing_')")

->execute();