插件窝 干货文章 ThinkPHP模型setInc/setDec方法不更新updateTime字段怎么办?

ThinkPHP模型setInc/setDec方法不更新updateTime字段怎么办?

update 字段 方法 time 665    来源:    2025-03-15

在ThinkPHP中,setIncsetDec 方法用于对某个字段进行自增或自减操作。默认情况下,这些方法不会自动更新 update_time 字段。如果你希望在执行 setIncsetDec 时自动更新 update_time 字段,可以通过以下几种方式实现:

方法1:手动更新 update_time 字段

在执行 setIncsetDec 后,手动调用 save 方法来更新 update_time 字段。

$model = new YourModel;
$model->where('id', $id)->setInc('field_name');
$model->where('id', $id)->save(['update_time' => time()]);

方法2:使用 update 方法

你可以使用 update 方法来同时更新字段和 update_time

$model = new YourModel;
$model->where('id', $id)->update([
    'field_name' => Db::raw('field_name + 1'),
    'update_time' => time(),
]);

方法3:使用 before_update 事件

如果你希望在每次更新时自动更新 update_time 字段,可以在模型中定义 before_update 事件。

class YourModel extends Model
{
    protected $autoWriteTimestamp = true; // 开启自动写入时间戳

    protected $updateTime = 'update_time'; // 指定更新时间字段

    protected static function onBeforeUpdate($model)
    {
        $model->update_time = time();
    }
}

方法4:使用 Db::raw 表达式

你可以在 setIncsetDec 方法中使用 Db::raw 表达式来同时更新 update_time 字段。

use think\facade\Db;

$model = new YourModel;
$model->where('id', $id)->setInc('field_name');
$model->where('id', $id)->update(['update_time' => Db::raw('NOW()')]);

方法5:使用 setField 方法

你可以使用 setField 方法来同时更新多个字段。

$model = new YourModel;
$model->where('id', $id)->setField([
    'field_name' => Db::raw('field_name + 1'),
    'update_time' => time(),
]);

总结

以上方法都可以实现 setIncsetDec 时更新 update_time 字段的需求。选择哪种方法取决于你的具体需求和代码风格。如果你希望在所有更新操作中都自动更新 update_time 字段,推荐使用方法3(before_update 事件)。如果只是偶尔需要更新 update_time 字段,使用方法1或方法2更为灵活。