【发布时间】:2014-12-06 06:41:56
【问题描述】:
我发现,在 Laravel 中构建我的数据库架构时,失败的迁移不会回滚,这使得迁移毫无意义。
例如,我有这个迁移:
Schema::create('accounts', function(Blueprint $table)
{
$table->increments('act_id');
$table->string('act_name', 50)->unique();
$table->boolean('act_active')->default(1);
$table->unsignedInteger('act_type');
$table->unsignedInteger('act_businesstype')->default(1);
$table->timestamps();
});
Schema::table('accounts', function($table)
{
$table->foreign('act_businesstype')->references('bst_id')->on('businesstypes');
});
无论如何,如果我运行该迁移,表创建得很好,但外键失败,我得到一个错误。没关系。我应该得到一个错误。但是,常识让我假设以下几点:
- 由于迁移失败,更改应自动回滚。好吧,他们没有。
好的,那么
- 我应该调用 migrate:rollback 来撤消这些更改。好吧,没有发生迁移的记录,所以我最终回滚了之前发生的迁移。
我在这里做错了吗?我想出如何“撤消”失败迁移的唯一方法是实际进入数据库并删除表。在处理复杂的架构时,我要来回修复错误,这非常令人沮丧。
所以,我想现在我已经吐槽了,我的问题是:
如何回滚引发错误的迁移?
【问题讨论】:
-
这是一个绝妙的问题,肯定会让 Laravel 开发者睡不着觉。一年后仍然没有有效的解决方案,令人失望。
-
同样我总是有这个问题,我必须进入数据库并手动删除表...... Laravel至少应该首先实现它!
-
我通常会注释我的迁移,成功运行它,然后定期回滚以执行迁移文件的
down方法中的代码。我还使用本地数据库实例来测试我的迁移并在我处理太多更改时清除模式。只有这样我才真正开始在真实数据库上运行我的迁移。但你是对的,似乎没有任何方法可以使用提供的工具来做到这一点。