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
相关产品推荐
相关产品推荐

