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自动填充,可以给模型加自定义控制属性:
- 先在User模型内新增控制属性
// 控制是否跳过modified_by填充,默认关闭 public $skipModifyByFill = false;
- 修改updating事件逻辑
static::updating(function ($model) { if ($model->skipModifyByFill) { return; } if ($user = Auth::user()) { $model->modified_by = $user->id; } });
- 需要跳过的场景使用前打开开关即可
$user->skipModifyByFill = true; $user->remember_token = $newToken; $user->save();
内容的提问来源于stack exchange,提问作者B.M.
相关产品推荐
相关产品推荐

