【问题标题】:laravel 4 artisan -- how to rollback to a specific migration state?laravel 4 artisan -- 如何回滚到特定的迁移状态?
【发布时间】:2013-07-15 20:32:48
【问题描述】:

假设我得到了a.phpb.phpc.phpd.php 迁移类文件。如何回滚到特定的迁移状态,例如在 b.php 中定义的状态,使用 artisan 命令?

【问题讨论】:

  • 您可以只运行两次“php artisan migrate:rollback” - 还是您想专门转到 b.php?
  • 我考虑过多次运行“php artisan migrate:rollback”。但是,如果我当时有 a.php、b.php 和 c.php 并完全运行它们,然后创建和迁移 d.php。在这种情况下,b.php 永远不会回滚,所以我想要一些东西让它专门回滚到 b.php。

标签: php migration laravel laravel-4


【解决方案1】:

恐怕你不能直接这样做。

您可以: 1、Rollback The Last Migration Operation(所有迁移都在最后一批运行)

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 现在显然会回滚您的所有迁移。
  • 修改我上面的评论 - 如果您有许多表等的大量迁移,并且您运行migrate:rollback,它将回滚上次迁移的所有操作,而不仅仅是最后一个操作。我错误地认为它只会回滚最后一个操作,而不是整个迁移。
  • 从 5.3 开始(在此答案发布后发布),您可以设置要回滚的步骤数,例如php artisan migrate:rollback --step=5 如您所见:laravel.com/docs/5.3/migrations#rolling-back-migrations。 @Yauheni Prakopchyk 在下面提到它。
【解决方案2】:

有一种方法可以通过手动编辑数据库来破解它。在migrations 表中更改batch 列,为最后一次迁移提供不同的批号。请注意,它们是按递增顺序排列的,因此请相应地进行编辑。这会跟踪单独应用了哪些迁移。

然后运行artisan:rollback,它将撤消最后一个“批处理”。

所以如果你想把它们全部分开,那么从顶部开始,给每个1,2,3,4,5等等......你可以看到它很容易编写脚本,你可以制作一个工匠如果您希望分离所有迁移,请使用命令。

【讨论】:

  • 这是 imo 更好的解决方案,不错的 hack!
  • 如何编辑我的批处理栏?它似乎锁定和灰色?有人可以请教吗?
  • 这就是我所做的。很好的答案。
【解决方案3】:

根据我的经验。我从不迁移:回滚。我通常会创建另一个迁移来执行“撤消/回滚”以前的迁移所需的所有更改。

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

【讨论】:

    【解决方案4】:

    Laravel 5.3

    使用 Laravel 5.3,无需编写繁重的脚本。因为它允许回滚给定数量的迁移。

    php artisan migrate:rollback --step=1
    

    这是手册page 供参考。

    【讨论】:

    • 这是最好的答案,因为它实际上是最新的。大多数其他答案都已过时。
    【解决方案5】:

    其实还没有这个功能。出乎意料

    最好的办法是创建一个新文件 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 //
      }
    }
    

    如您所见,您可以创建 up 和 down 调用这些迁移的 up 和 down 您想要恢复的内容。

    这不是理想,但这是我们可以做到的。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        有一个简单但肮脏的方法:

        如果您有迁移a.phpb.phpc.php,并且想要回滚cb,您可以简单地修改a.php,这样就会出现语法错误。 . 去掉分号什么的。

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

        不要忘记修复您在a.php 中故意犯的任何错误。

        【讨论】:

          【解决方案8】:

          由于 Laravel 仅提供 php artisan migrate:rollback 来回滚您的迁移脚本,回滚您选择的迁移脚本的最佳方法是创建一个新的迁移脚本并将该脚本放在您的 down 方法中(在您选择的迁移脚本上)新创建的迁移脚本。 希望对您有所帮助。

          【讨论】:

            【解决方案9】:

            使用 php artisan migrate:rollback 命令。

            php artisan migrate:rollback
            

            要查看回滚会做什么,请使用 --pretend 选项。

            php artisan migrate:rollback --pretend
            

            您还可以指定默认连接以外的数据库连接。

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

            【讨论】:

              猜你喜欢
              • 2013-06-14
              • 2011-04-08
              • 2017-10-25
              • 1970-01-01
              • 2014-06-21
              • 2016-08-19
              • 2013-10-28
              • 2017-02-24
              • 2017-03-18
              相关资源
              最近更新 更多