Laravel Eloquent更新表时requested_at字段非预期被修改问题
以下是针对该问题的分步排查方案:
检查数据库触发器
Laravel查询日志未记录requested_at的修改,但字段实际被变更,最常见的原因是MySQL触发器。执行以下命令查看目标表的触发器:SHOW TRIGGERS LIKE '你的表名';如果存在触发
updated_at变更时同步修改requested_at的触发器,直接删除或调整触发器逻辑即可。检查表结构的ON UPDATE配置
查看requested_at字段是否设置了ON UPDATE CURRENT_TIMESTAMP属性,这会导致字段在行更新时自动同步当前时间。执行命令查看字段详情:DESCRIBE 你的表名;若
requested_at的Extra列显示ON UPDATE CURRENT_TIMESTAMP,需要修改表结构移除该配置,对应迁移代码示例:Schema::table('你的表名', function (Blueprint $table) { $table->timestamp('requested_at')->nullable()->change(); });排查全局模型事件/观察者
虽然使用DB::table绕过了模型操作,但仍需确认是否存在全局注册的模型事件或观察者(例如在AppServiceProvider中),是否会对目标表的更新操作附加额外逻辑。检查app/Observers目录及服务提供者中的事件绑定代码。开启MySQL通用查询日志
若以上步骤未找到问题,开启MySQL通用查询日志可以捕获所有执行的SQL语句(包括触发器内部的操作),准确定位修改来源:-- 临时开启通用日志 SET GLOBAL general_log = 'ON'; SET GLOBAL general_log_file = '/tmp/mysql_general.log';执行定时任务后查看日志文件,找到修改
requested_at的SQL语句,排查完成后记得关闭日志:SET GLOBAL general_log = 'OFF';验证定时任务的独立性
确认是否存在其他定时任务、队列任务或外部回调,在同一时间对目标数据进行了修改。可以暂时禁用其他任务,单独运行当前定时任务,观察requested_at是否仍被修改。
内容的提问来源于stack exchange,提问作者Gregory Farias

