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

Laravel Eloquent更新表时requested_at字段非预期被修改问题

Laravel定时任务更新数据时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:54:50