插件窝 干货文章 ThinkPHP模型setInc/setDec方法更新数据时,updateTime字段为何不自动更新?

ThinkPHP模型setInc/setDec方法更新数据时,updateTime字段为何不自动更新?

方法 字段 更新 updateTime 433    来源:    2025-03-14

在ThinkPHP中,setIncsetDec 方法是用于对数据库字段进行原子递增或递减操作的快捷方法。这两个方法通常用于更新某个字段的值,而不需要手动编写SQL语句。

然而,setIncsetDec 方法并不会自动触发模型的自动时间戳更新机制。也就是说,即使你在模型中定义了 updateTime 字段为自动更新时间戳,使用 setIncsetDec 方法时,updateTime 字段也不会自动更新。

原因

ThinkPHP 的自动时间戳更新机制是通过模型的 save 方法触发的。而 setIncsetDec 方法是直接通过数据库查询构建器执行的,绕过了模型的 save 方法,因此不会触发自动时间戳更新。

解决方案

如果你希望在执行 setIncsetDec 方法时,updateTime 字段也能自动更新,可以手动更新 updateTime 字段。以下是几种解决方案:

1. 手动更新 updateTime 字段

在执行 setIncsetDec 方法后,手动更新 updateTime 字段:

$model->where('id', $id)->setInc('field_name', $step);
$model->where('id', $id)->update(['updateTime' => time()]);

2. 使用 save 方法

如果你希望保持自动时间戳更新的功能,可以考虑使用 save 方法来实现递增或递减操作:

$model = Model::find($id);
$model->field_name += $step; // 递增操作
$model->save();

3. 使用 update 方法

你也可以直接使用 update 方法,同时更新字段值和 updateTime

$model->where('id', $id)->update([
    'field_name' => Db::raw('field_name + ' . $step),
    'updateTime' => time(),
]);

总结

setIncsetDec 方法不会自动更新 updateTime 字段,因为它们直接操作数据库,绕过了模型的 save 方法。如果你需要更新 updateTime 字段,可以手动更新,或者使用 save 方法来实现递增或递减操作。