You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel应用如何阻止登录场景下自动更新user表的update_by字段

解决方案

有三种常用实现方式,可根据你的业务场景选择:

方案1:事件回调内过滤更新字段(最推荐,无需修改其他业务代码)

直接修改原模型的updating事件逻辑,判断本次更新仅修改remember_token时跳过填充逻辑即可:

public static function boot()
{
    parent::boot();
    static::creating(function ($model) {
        if ($user = Auth::user()) {
            $model->created_by = $user->id;
            $model->modified_by = $user->id;
        }
    });
    static::updating(function ($model) {
        // 仅更新remember_token时跳过modified_by填充
        if (array_keys($model->getDirty()) === ['remember_token']) {
            return;
        }
        if ($user = Auth::user()) {
            $model->modified_by = $user->id;
        }
    });
}

说明:getDirty()方法会返回模型当前待写入的变更字段数组,仅当变更字段只有remember_token时直接终止回调,不影响其他正常更新场景。

方案2:更新remember_token时临时跳过所有模型事件

如果你的登录逻辑是自定义的,可以在更新remember_token时使用Laravel内置的静默保存方法,不触发任何模型事件:

// 使用saveQuietly()方法静默保存,不会触发任何模型事件
$user->remember_token = $newToken;
$user->saveQuietly();

说明:该方案会跳过该模型的所有事件回调,如果你还有其他更新事件逻辑不建议使用。

方案3:新增自定义开关属性(扩展性最好,适配多跳过场景)

如果后续还有其他场景需要跳过modified_by自动填充,可以给模型加自定义控制属性:

  1. 先在User模型内新增控制属性
// 控制是否跳过modified_by填充,默认关闭
public $skipModifyByFill = false;
  1. 修改updating事件逻辑
static::updating(function ($model) {
    if ($model->skipModifyByFill) {
        return;
    }
    if ($user = Auth::user()) {
        $model->modified_by = $user->id;
    }
});
  1. 需要跳过的场景使用前打开开关即可
$user->skipModifyByFill = true;
$user->remember_token = $newToken;
$user->save();

内容的提问来源于stack exchange,提问作者B.M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:27:00