一般来说,我们会对数据库已经存在的内容进行更新,对不存在的进行插入,但是有时候我们并不确定数据库里有没有这条记录。
这个时候,我们课哟使用db_merge()函数来解决这个问题,这个函数会自动为您选择:如果有则更新,如果没有则插入。
在不使用这个函数的情况下,大部分人会这样解决:
<?php
if (db_result(db_query("SELECT COUNT(*) FROM {example} WHERE id=:id", array(':id' => $id))->fetchField())) {
// 运行一个更新
}
else {
// 运行一个插入
}
?>
使用了这个函数我们这个操作将会变得简单和灵活。
<?php
db_merge('node', $options);
?>
db_merge接受两个参数,数据库表名,数据库连接选项。
<?php
db_merge('example')
->key(array('name' => $name))
->fields(array(
'field1' => $value1,
'field2' => $value2,
))
->updateFields(array(
'field1' => $alternate1,
))
->execute();
?>
db_merge()中使用key来充当where的角色,控制查询选项。
在这个例子中,如果'name'=>$name这个记录存在则执行updateFields中的更新,否则执行fields中的插入。
updateFields和fields的数据结构是一样的。
看下面的例子:
<?php
db_merge('example')
->key(array('name' => $name))
->fields(array(
'field1' => $value1,
'field2' => $value2,
))
->expression('field1', 'field1 + :inc', array(':inc' => 1))
->execute();
?>
这个例子和上面的差不多,只不过当数据存在的时候会执行一个更新运算,而不是直接更新。
expression()涌来执行更新运算,接受三个参数,字段名,运算表达式,如果表达式里使用变量请使用代替符,第三个参数是一个数组,提供被代替符替换的变量,形式见上面的表达式。
expression()可以被多次执行。
原文地址:http://w3123.com/node/873