插件窝 干货文章 ThinkPHP模型setInc和setDec方法更新字段时updateTime字段为何不更新?

ThinkPHP模型setInc和setDec方法更新字段时updateTime字段为何不更新?

字段 updateTime 方法 更新 979    来源:    2025-03-13

在ThinkPHP中,setIncsetDec 方法用于对数据库中的某个字段进行自增或自减操作。这两个方法在执行时,默认情况下不会自动更新 updateTime 字段(假设 updateTime 字段是用来记录数据最后更新时间的时间戳字段)。

原因分析

  1. 自动时间戳:ThinkPHP 的模型层提供了自动时间戳功能,可以在模型类中通过 autoWriteTimestamp 属性来启用。如果启用了自动时间戳,模型在插入或更新数据时会自动更新 create_timeupdate_time 字段。

  2. setIncsetDec 方法的特殊性setIncsetDec 方法是直接对数据库字段进行自增或自减操作,而不是通过模型的 save 方法。因此,即使启用了自动时间戳,这两个方法也不会触发自动更新 updateTime 字段的逻辑。

解决方案

如果你希望在执行 setIncsetDec 方法时也能更新 updateTime 字段,可以通过以下方式实现:

方法一:手动更新 updateTime 字段

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

$model = new YourModel;
$model->where('id', $id)->setInc('field_name'); // 自增操作
$model->where('id', $id)->save(['updateTime' => time()]); // 手动更新 updateTime 字段

方法二:使用 update 方法

你可以直接使用 update 方法来同时更新字段和 updateTime 字段。

$model = new YourModel;
$model->where('id', $id)->update([
    'field_name' => Db::raw('field_name + 1'), // 自增操作
    'updateTime' => time() // 更新 updateTime 字段
]);

方法三:扩展 setIncsetDec 方法

如果你希望在 setIncsetDec 方法中自动更新 updateTime 字段,可以通过扩展模型类来实现。

class YourModel extends Model
{
    public function setIncWithUpdateTime($field, $step = 1)
    {
        $this->where('id', $this->id)->setInc($field, $step);
        $this->save(['updateTime' => time()]);
    }

    public function setDecWithUpdateTime($field, $step = 1)
    {
        $this->where('id', $this->id)->setDec($field, $step);
        $this->save(['updateTime' => time()]);
    }
}

然后你可以这样调用:

$model = new YourModel;
$model->setIncWithUpdateTime('field_name'); // 自增并更新 updateTime
$model->setDecWithUpdateTime('field_name'); // 自减并更新 updateTime

总结

setIncsetDec 方法默认不会更新 updateTime 字段,因为它们直接操作数据库字段而不触发模型的自动时间戳逻辑。你可以通过手动更新、使用 update 方法或扩展模型类来实现同时更新字段和 updateTime 字段的需求。