Laravel migrate删除created_at列后调用timestamps报重复列错误如何解决
报错原因
Laravel处理同一个Schema::table闭包内的表结构修改逻辑时,会优先执行所有字段新增、修改操作,最后再执行字段删除操作,和你编写代码的先后顺序无关。
你写的代码虽然先声明删除created_at,再调用timestamps()新增时间戳字段,但实际生成的SQL执行顺序是先执行add created_at、add updated_at,再执行drop created_at,所以会触发字段重复的报错。
正确实现方案
将删除操作和新增操作拆分到两个独立的Schema::table闭包中即可,每个独立闭包会作为单独的SQL批次按顺序执行,保证删除操作完成后再执行新增操作:
// 第一个闭包先执行字段删除 Schema::table('cms_myterms', function (Blueprint $table) { $table->dropColumn('created_at'); }); // 第二个闭包再新增时间戳字段 Schema::table('cms_myterms', function (Blueprint $table) { $table->timestamps(); });
如果原表中还存在旧的updated_at字段需要同步删除,只需要在第一个闭包的dropColumn参数里加上对应字段即可:
$table->dropColumn(['created_at', 'updated_at']);
内容的提问来源于stack exchange,提问作者TreeStreetCat
相关产品推荐
相关产品推荐

