在ThinkPHP中,setInc 和 setDec 方法用于对某个字段进行自增或自减操作。默认情况下,这些方法不会自动更新 update_time 字段。如果你希望在执行 setInc 或 setDec 时自动更新 update_time 字段,可以通过以下几种方式实现:
update_time 字段在执行 setInc 或 setDec 后,手动调用 save 方法来更新 update_time 字段。
$model = new YourModel;
$model->where('id', $id)->setInc('field_name');
$model->where('id', $id)->save(['update_time' => time()]);
update 方法你可以使用 update 方法来同时更新字段和 update_time。
$model = new YourModel;
$model->where('id', $id)->update([
'field_name' => Db::raw('field_name + 1'),
'update_time' => time(),
]);
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();
}
}
Db::raw 表达式你可以在 setInc 或 setDec 方法中使用 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()')]);
setField 方法你可以使用 setField 方法来同时更新多个字段。
$model = new YourModel;
$model->where('id', $id)->setField([
'field_name' => Db::raw('field_name + 1'),
'update_time' => time(),
]);
以上方法都可以实现 setInc 或 setDec 时更新 update_time 字段的需求。选择哪种方法取决于你的具体需求和代码风格。如果你希望在所有更新操作中都自动更新 update_time 字段,推荐使用方法3(before_update 事件)。如果只是偶尔需要更新 update_time 字段,使用方法1或方法2更为灵活。