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

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

字段 updateTime 自动 更新 954    来源:    2025-03-15

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

原因分析

  1. 自动时间戳机制未启用:ThinkPHP 提供了自动时间戳机制,可以在模型中使用 autoWriteTimestamp 属性来自动更新 create_timeupdate_time 字段。如果这个机制没有启用,updateTime 字段不会自动更新。

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

解决方案

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

    $model = new YourModel;
    $model->where('id', $id)->setInc('field_name');
    $model->where('id', $id)->update(['updateTime' => time()]);
    
  2. 使用 save 方法替代 setIncsetDec: 如果你希望自动更新时间戳,可以使用 save 方法来更新字段值。

    $model = YourModel::find($id);
    $model->field_name = $model->field_name + 1; // 自增操作
    $model->save();
    

    这样,updateTime 字段会自动更新。

  3. 启用自动时间戳: 在模型中启用自动时间戳机制,确保 updateTime 字段在每次更新时自动更新。

    class YourModel extends Model
    {
       protected $autoWriteTimestamp = true;
       protected $updateTime = 'updateTime'; // 如果你的字段名不是默认的 'update_time'
    }
    

    启用后,使用 save 方法时,updateTime 字段会自动更新。

总结

setIncsetDec 方法不会自动更新 updateTime 字段,因为它们直接操作数据库字段而不触发模型的 save 方法。你可以选择手动更新 updateTime 字段,或者使用 save 方法来替代 setIncsetDec,以便利用自动时间戳机制。