Laravel 5.7迁移能否移动数据表列?
问题分析与解决方案
你遇到的情况确实是Laravel 5.7的Schema Builder存在的一个限制——修改已存在的列时,无法通过->first()或->after()来调整列的位置,这也是你的迁移代码执行后无效果也无报错的核心原因。
为什么创建列时可行,修改时不行?
当你在创建列时使用$table->unsignedInteger('id')->first(),Laravel底层会生成包含FIRST关键字的ALTER TABLE语句,以此来添加列并指定位置。但对于change()方法,Laravel 5.7的实现逻辑里并没有处理first()或after()这类位置相关的选项,所以你调用这些方法不会生成对应的SQL逻辑,自然不会对表结构产生任何变化。
可行的解决方案:使用原生SQL语句
既然你的环境是MariaDB/MySQL 5.5,直接用原生ALTER TABLE语句就能实现列位置调整,这也是当前环境下最可靠的方式:
public function up() { // 将id列移到表的第一个位置 DB::statement('ALTER TABLE my_table MODIFY COLUMN id UNSIGNED INTEGER FIRST'); } public function down() { // 如果需要回滚,根据原来的列位置调整语句,比如移到某个列之后 // DB::statement('ALTER TABLE my_table MODIFY COLUMN id UNSIGNED INTEGER AFTER some_column'); }
如果需要将列移到某个指定列的后面,只需要把FIRST替换成AFTER your_column_name即可。
补充说明
后续的Laravel版本(比如Laravel 8及以上)对Schema Builder的change()方法做了扩展,支持通过->after()来调整列位置,但Laravel 5.7作为较旧的版本并没有这个特性,所以原生SQL是你当前环境下的最优选择。
内容的提问来源于stack exchange,提问作者123
相关产品推荐
相关产品推荐

