如何在CodeIgniter中使用updateBatch方法实现数据库字段值的累加更新?
如何在CodeIgniter中使用updateBatch方法实现数据库字段值的累加更新?
嘿,我懂你这个需求!普通SQL里直接写votes = votes + 1234很简单,但用CodeIgniter的updateBatch的时候,直接像你那样写'votes' + 1234肯定不行——因为PHP会把字符串'votes'转成数字0,最后实际传进去的是1234,等于直接把votes字段改成1234,根本不是累加效果。
下面给你说两种可行的方案,对应不同的CodeIgniter版本,先看你用的CI4的写法(从你的代码里的$this->db->table()能看出来):
方案一:CodeIgniter 4 推荐写法(使用RawSql类)
CI4提供了RawSql类来处理这种需要直接传入SQL表达式的场景,它会告诉框架不要转义这个值,直接当作SQL的一部分执行。
步骤很简单:
- 首先引入
RawSql类(如果你的控制器/模型里还没引入的话) - 构造批量更新的数据数组,把需要累加的字段值用
RawSql包装起来 - 调用
updateBatch即可
示例代码:
// 引入RawSql类 use CodeIgniter\Database\RawSql; // 构造批量更新数据,这里可以放多条记录 $updateData = [ [ 'id' => 1000, 'votes' => new RawSql('votes + 1234') ], // 如果你还要更新其他用户,直接加数组元素就行 [ 'id' => 1001, 'votes' => new RawSql('votes + 567') ] ]; // 执行批量更新 $builder = $this->db->table('user_master'); $builder->updateBatch($updateData, 'id');
这样生成的SQL就和你想要的一样,会对每个id对应的记录执行votes = votes + 对应数值的更新。
方案二:如果是CodeIgniter 3的写法
如果你还在使用CI3,那写法略有不同,你需要把字段值写成一个包含三个元素的数组:[字段名, SQL表达式, FALSE],告诉框架不要转义这个表达式:
$updateData = [ [ 'id' => 1000, 'votes' => ['votes', 'votes + 1234', FALSE] ] ]; $this->db->update_batch('user_master', $updateData, 'id');
最后再提醒一下:千万别像你之前那样直接写'votes' + 1234,PHP会把字符串'votes'强制转换成数字0,结果就是把votes字段直接设为1234,完全达不到累加的目的哦!
备注:内容来源于stack exchange,提问作者CodersWorld
相关产品推荐
相关产品推荐

