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

Laravel迁移:解决MariaDB timestamp字段非预期自动更新问题

问题解决:Laravel迁移中expired_at字段被意外更新

问题原因

MySQL的TIMESTAMP类型字段存在默认行为:当表中其他字段发生更新时,未明确配置的TIMESTAMP字段会自动更新为当前时间戳。这就是你仅更新sold_at字段时,expired_at被同步修改的核心原因。

解决方案

方案1:改用datetime字段类型

DATETIME类型不存在自动更新的默认行为,完全符合需求,修改迁移代码如下:

Schema::create('auctions', function (Blueprint $table) {
    $table->id();
    $table->datetime('expired_at'); // 替换原timestamp类型为datetime
    $table->timestamp('sold_at')->nullable()->default(null);
    // 其他字段
});

方案2:保留timestamp类型并关闭自动更新

如果需要继续使用TIMESTAMP类型,通过useCurrent(false)明确关闭其自动更新行为:

Schema::create('auctions', function (Blueprint $table) {
    $table->id();
    $table->timestamp('expired_at')->useCurrent(false); // 禁用自动更新
    $table->timestamp('sold_at')->nullable()->default(null);
    // 其他字段
});

额外检查

同时可以确认你的Auction模型中,是否误将expired_at加入了$dates或$casts数组(虽然这不是导致此问题的主要原因,但可以排除模型层面的干扰)。

内容的提问来源于stack exchange,提问作者Pejman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:11:04