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 5.5 Migration not found on migrate:refresh with --path 选项
Laravel migration 在进行很小的修改时怎么解决