Laravel 4 Artisan -- 如何回滚到特定的迁移状态?

26
假设我有 a.phpb.phpc.phpd.php 这四个迁移类文件。如何使用 Artisan 命令回滚到特定的迁移状态,例如回滚到 b.php 中定义的状态?

你能否只运行 "php artisan migrate:rollback" 两次 - 还是你想要特别地去 b.php? - Laurence
我曾经考虑过多次运行“php artisan migrate:rollback”。但是,如果我同时有a.php、b.php和c.php,并且一起运行它们,然后创建并迁移d.php,那么在这种情况下,b.php将永远不会回滚,因此我需要一些东西来使其特别回滚到b.php。 - do.
9个回答

39

很抱歉,您不能直接这样做。

您可以: 1、回滚上一次迁移操作(撤销上一批次中运行的所有迁移)。

php artisan migrate:rollback

2、回滚所有迁移

php artisan migrate:reset

3、回滚所有的迁移,然后再次运行它们。

php artisan migrate:refresh  
php artisan migrate:refresh --seed

在您的情况下,修改 b.php 文件及其 up() 方法,然后执行 artisan migrate:refresh 命令。


注意:php artisan migrate:rollback 看起来现在会回滚您的所有迁移。 - Vigs
3
更正我上面的评论 - 如果你有许多表等需要大规模迁移,并且运行 migrate:rollback 命令,它将回滚自上一个迁移以来的所有操作,而不仅仅是最后一个操作。我之前错误地认为它只会回滚最后一项操作,而不是整个迁移过程。 - Vigs
3
截至5.3版本(此回答发布后发布的版本),你可以设置想要回滚的步骤数,例如php artisan migrate:rollback --step=5,详情请参见此处:https://laravel.com/docs/5.3/migrations#rolling-back-migrations。如下方@Yauheni Prakopchyk所提到。 - Marty

28

有一种方法可以通过手动编辑数据库来进行黑客攻击。在 migrations 表格中,通过为最后一个迁移指定不同的批次号码来更改 batch 列。请注意,它们是按递增顺序排列的,因此需要相应地进行编辑。这将跟踪单独应用了哪些迁移。

然后运行 artisan:rollback 命令,它将撤消上一个 "batch"。

所以,如果您想将它们全部分开,请从顶部开始,依次为每个迁移编号为1、2、3、4、5等等... 您可以看到它很容易编写脚本,并且如果您希望将所有迁移分开,则可以制作一个 artisan 命令。


3
我认为那是更好的解决方案,不错的技巧! - Shay
我该如何编辑我的批处理列?它似乎被锁定并且变灰?请问有谁可以提供建议吗? - code-8
1
这就是我所做的。好答案。 - Caleb Jacobo

5

根据我的经验,我从未使用过migrate:rollback。通常我会创建另一个迁移文件,以执行所有需要“撤消/回滚”之前迁移所做更改的操作。

这样你就可以灵活地回滚2-x步,只需创建一个新的迁移文件来实现你想要的更改,然后通过php artisan migrate运行新的迁移文件即可。


5

Laravel 5.3

Laravel 5.3使得编写代码变得轻松。它允许回滚指定数量的迁移操作,无需进行繁琐的脚本编写。

php artisan migrate:rollback --step=1

以下是参考手册页面


这是最好的答案,因为它实际上是最新的。大多数其他答案都已过时。 - GTS Joe

3

事实上,这个功能目前还没有(出现)。令人惊讶的是。

最好的想法是创建一个名为backtob.php的新文件,并让它调用您其他迁移文件的向下操作。为了避免复制和粘贴,您可以像这样做:

class BacktoB {
  public function up () {
     // the database is in the after D state //
     $migrateD = new D();
     $migrateD->down();
     // the database is in the after C state //
     $migrateC = new C();
     $migrateC->down();
     // the database is in the before C state //
     // before C = B //
  }
  public function down () {
     // the database is in the B state //
     $migrateC = new C();
     $migrateC->up();
     // the database is in the after C state //
     $migrateD = new D();
     $migrateD->up();
     // the database is in the after D state //
  }
}

正如您所看到的,您可以创建向上和向下的迁移,以调用您想要还原的那些迁移的向上和向下操作。

虽然不是理想的解决方案,但这是我们能做的。


2

如果你真的想要的话,你可以编写一个自定义函数来查询迁移表,寻找所需的文件,并计算需要回滚的次数,然后循环执行'migrate:rollback'直到达到所需的迁移...


1

有一种简单但不太好的方法:

如果您有迁移文件 a.phpb.phpc.php,并希望回滚 cb,您可以简单地修改 a.php,使其出现语法错误... 比如漏掉一个分号或其他什么。

因此,当您运行 php artisan migrate:rollback 时,它将回滚 cb,并在 a 中停止并报错。从那时起,对 cb 的回滚将被视为最后一次迁移操作。

别忘了修复您故意在 a.php 中制造的错误。


0
使用php artisan migrate:rollback命令。
php artisan migrate:rollback

为了查看回滚的效果,请使用 --pretend 选项。

php artisan migrate:rollback --pretend

您还可以指定一个与默认数据库连接不同的数据库连接。

php artisan migrate:rollback --pretend --database=other-one

0

由于Laravel只提供了php artisan migrate:rollback来回滚您的迁移脚本,因此回滚所选的迁移脚本的最佳方法是创建一个新的迁移脚本,并将该脚本放在您选择的迁移脚本的down方法中,以便将其迁移到新创建的迁移脚本中。 希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接