Laravel migrate:回滚添加和删除表列

Posted

技术标签:

【中文标题】Laravel migrate:回滚添加和删除表列【英文标题】:Laravel migrate:rollback adding and deleting table columns 【发布时间】:2015-01-01 20:33:47 【问题描述】:

我用过php artisan migrate:make add_something_to_to_user_table --table=users

编码

Schema::table('users', function(Blueprint $table)
    
        $table->string('description1');
        $table->string('description2');
        $table->string('description3');
    );

并添加三个字段并给出php artisan migrate,这些字段被存储到数据库中

还发现migration table更新为2014_11_05_145536_add_something_to_to_user_table这一行

现在当我使用php artisan migrate:rollback

迁移表中的2014_11_05_145536_add_something_to_to_user_table 行丢失,但添加到用户表的列保持不变

为什么不删除表中的字段导致再次使用php artisan migrate时出错...

【问题讨论】:

您是否在迁移类中正确设置了down() 方法? 【参考方案1】:

您的迁移中应该有一个 down() 方法,应该如下所示:

public function down()

    Schema::table('users', function($table)
    
        $table->dropColumn(array('description1', 'description2', 'description3'));
    );

这将在回滚时调用,并负责删除迁移添加的列。

【讨论】:

我是否必须在同一文件中提及down()up() 函数中的所有列?? 是的,它们应该在同一个文件中。在迁移类中,up 方法将应用更改,down 方法将撤消它们。 请记住,如果您已经运行了 artisan migrate:rollback 命令并且您没有设置 down 方法,则必须在重新运行迁移之前手动删除列(这就是为什么您尝试调用migrate 时出错,因为它尝试添加已经存在的 3 列)。 所以如果我想删除一列,我必须在up() 中删除并在down() 中添加,对吗?? 没错。在up 中,您可以设置所需的更改,而在down 中,您则完全相反。【参考方案2】:

根据 laravel 7+ 文档,当您需要同时删除多个列时,这也可以工作。

public function down()
    Schema::table('users', function (Blueprint $table) 
     $table->dropColumn(['description1', 'description2', 'description3']);
   );

【讨论】:

【参考方案3】:

添加 down 公用函数,用于在回滚时删除 users 表..

public function down()

    Schema::drop('users');

【讨论】:

以上是关于Laravel migrate:回滚添加和删除表列的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Migrations 出现异常错误

Laravel 5.5 Migration not found on migrate:refresh with --path 选项

回滚 laravel5 中的特定迁移

Laravel migration 在进行很小的修改时怎么解决

在特定的其他列之前或之后添加 sql 表列 - 通过 Laravel 4.1 中的迁移

迁移后的 Laravel 种子