You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的一部分执行。

步骤很简单:

  1. 首先引入RawSql类(如果你的控制器/模型里还没引入的话)
  2. 构造批量更新的数据数组,把需要累加的字段值用RawSql包装起来
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:28:05