回滚Laravel中的一个特定迁移


238

我想要

仅回滚:

Rolled back: 2015_05_15_195423_alter_table_web_directories


我跑

php artisan migrate:rollback,我的3个迁移正在回滚。

Rolled back: 2015_05_15_195423_alter_table_web_directories
Rolled back: 2015_05_13_135240_create_web_directories_table
Rolled back: 2015_05_13_134411_create_contacts_table

我删除

web_directories和我的contacts桌子都无意间 我从不希望这种情况发生,而且如果我只能回退特定的故障,那么这种灾难将永远不会发生。


46
赞!只是您写这个问题的方式
而已

我正在使用sqlpro,它使我可以更改批号,因此我只更改了编号并回滚了
滚动

考虑到将来的回滚,请使用'php artisan migration --step'逐步运行每个迁移,这将仅在运行php artisan migration时回滚一个迁移:rollback
James

Answers:


146

如果您查看migrations表格,则会看到每个迁移都有一个批号。因此,当您回滚时,它将回滚最后一批中的每个迁移。

如果您只想回滚最近的迁移,则只需将批号加1。然后,下次运行该rollback命令时,它只会回滚该迁移,因为它位于其自己的“批处理”中。


好推荐!我试图编辑批号,但不允许我这样做。这是一种锁定,呈灰色。我在Mac上的MySQL WorkBench中尝试过。有什么想法吗?
cyber8200 2015年

您知道为什么,当我尝试配置批号时,我的批号是锁定的吗?
cyber8200 2015年

1
通过查询来更新迁移表中的批号,例如:UPDATE migrationsSET batch= 2 WHERE migration='name_of_the_migration';
伊姆兰·汗

3
@ImranKhan如果您有两个以上的批次,则将批次号硬编码为'2'并不是特别好。
Martin Bean

使用Sequel Pro(仅适用于Mac OS)可轻松编辑“迁移”表并更改批号。
Arslan Ramay

271

Laravel 5.3+

回滚一步。本机。

php artisan migrate:rollback --step=1

这是手册页:docs


Laravel 5.2及更低版本

没有麻烦就没有办法。有关详细信息,请查看Martin Bean的答案


1
不过,除非OP使用开发中的Laravel版本编写其应用程序,否则它不会有用。
Martin Bean

4
这将是一个很好的功能,但是缺少指定要回滚哪些迁移的功能。我认为这只是迁移表中列出的最后一个吗?当我迁移东西时,我通常不打算回滚,因此我想回滚的迁移是最后一次迁移的机会不是很高。好像laravel有点丢球。我想,回滚单个迁移的唯一安全方法是手动编辑迁移表。
双向飞碟,

@ SkeetsO'Reilly同意,对迁移的想法不是很周到。但是它们在这里,因此您不会一开始就被迫寻找迁移软件包。
Yauheni Prakopchyk

它就像一种魅力。我正在开发一个新的迁移(在现有表中添加一列),然后看到我以“ uuid”类型迁移,我想要“字符串”。您的回滚提示工作完美。回滚。更新代码。再次迁移。=> 100%好。Laravel 5.7
Florian Doyen

我如何通过(php artisan)命令行获取我的最后N个迁移步骤。如果我愿意,我可以寻求db并找到我的迁移表和查询以获取我的历史记录和运行的上一次迁移。但另一方面,我不能总是使用我的迁移文件夹,因为新迁移并不总是排序。对于这个问题,我只建议我们使用php artisan make:migration,不要使用这些现有文件中间的迁移文件副本。
saber tabatabaee yazdi

24

每次回滚时,您都会获得最后一批迁移。使用命令

php artisan migrate:rollback --step=1

18

如果您无法完成@Martin Bean的指示,则可以尝试其他技巧。

创建一个新的迁移,并在该文件上的up()方法中插入要回滚的迁移的down()方法中的内容,在down()方法中插入up()方法中的内容。

例如,如果您的原始迁移是这样的

public function up()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}
public function down()
{
    Schema::drop('users');
}

然后在新的迁移文件中执行此操作

public function up()
{
    Schema::drop('users');
}
public function down()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}

然后运行迁移,它将删除该表。如果您再次想要回滚,只需回滚即可。


感谢您的回答,但我对此一无所知。快速的问题,您知道为什么我不能编辑迁移表的批处理列吗?
cyber8200

1
@ihue有点晚了,但是您不能使用UI对其进行编辑的原因是表迁移没有主键。您必须编写sql自己进行编辑。
维克

15

更好地使用刷新迁移

您可以通过向refresh命令提供step选项来回滚并重新迁移有限数量的迁移。例如,以下命令将回滚并重新迁移最后两次迁移:

php artisan migrate:refresh --step=2

否则使用回滚迁移

通过为rollback命令提供step选项,可以回滚有限数量的迁移。例如,以下命令将回滚最近的三个迁移:

php artisan migrate:rollback --step=3

有关迁移的更多详细信息,请参见


11

最好的方法是创建一个新的迁移并在其中进行所需的更改。

最坏的解决方法(如果您可以访问数据库,并且可以对该表的数据进行RESET即可):

  1. 转到数据库并删除 /重命名迁移条目your-specific-migration
  2. 删除表创建者your-specific-migration
  3. php artisan migrate --path=/database/migrations/your-specific-migration.php

这将迫使laravel运行特定的迁移,因为Laravel的迁移历史中没有关于它的任何条目

更新:Laravel方式(谢谢@ thiago-valente)

跑:

php artisan migrate:rollback --path=/database/migrations/your-specific-migration.php

然后:

php artisan migrate

这将重新运行该特定迁移


4
我用过 php artisan migrate:rollback --path=/database/migrations/your-specific-migration.php,最后 php artisan migrate
Thiago Valente,

8

回答这个问题可能有点晚了,但是我觉得这是一种非常好的,干净的和有效的解决方法。我会尽量做到透彻。

在创建迁移之前,请创建其他目录,如下所示:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

然后,在创建迁移时,运行以下命令(以表为例):

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_1

要么

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_2

要么

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_3

上面的命令将使迁移文件位于给定的目录路径中。然后,您只需运行以下命令即可通过文件分配的目录迁移文件。

    php artisan migrate alter_table_web_directories --path=database/migrations/batch_1

*注意:您可以将batch_1更改为batch_2或batch_3或要将迁移文件存储在其中的任何文件夹名称。只要它保留在database / migrations目录或某些指定目录中即可。

接下来,如果您需要回滚特定的迁移,则可以按批次回滚,如下所示:

    php artisan migrate:rollback --step=1
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_1

要么

    php artisan migrate:rollback --step=2
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_2

要么

    php artisan migrate:rollback --step=3
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_3

使用这些技术将为您提供更大的灵活性,并控制您的数据库以及对架构进行的任何修改。


除非laravel文档不正确,否则“ --step = 3”表示它将回滚最近的3次迁移,而不是回滚到第3次迁移。我不知道将迁移放在不同的文件夹中是否会完全改变,但是我不希望如此。如果按名称指定回滚有效,那就太好了!但是,如果您回滚任何参数,它将抱怨“参数过多”。
双向飞碟,

4

回滚一步。本机。

php artisan migrate:rollback --step=1

回滚两步。本机。

php artisan migrate:rollback --step=2


4

如果要回滚上一次迁移。

php artisan migrate:rollback

如果要回滚特定的迁移,请转到迁移表并批量设置该记录的最高值。然后。

php artisan migrate:rollback

目前,我正在使用laravel 5.8,如果无法正常使用其他版本的laravel,请通知我。


对我有用。上一次迁移的情况就是这样。
CodeToLife

3

一张一张地迁移表。

将要回滚的迁移的批号更改为最高。

运行migration:rollback。

可能不是处理大型项目的最舒适的方法。


3

如果要修改原始迁移文件并再次迁移,可以使用此软件包进行迁移。(适用于Laravel 5.4或更高版本)

首先,在您的Laravel项目中安装软件包:

composer require caloskao/migrate-specific

app/Console/Kernel.php以下位置注册命令:

protected $commands = [
    \CalosKao\MigrateSpecific::class
];

现在,运行此命令来迁移文件

php artisan migrate:specific database/migrations/table.php

这可以通过使用来实现php artisan:migrate --path=database/migrations/my_migration.php。在执行操作之前,请确保该migrations表中没有的条目my_migration
Aleksandar

1
INSERT INTO homestead.bb_migrations (`migration`, `batch`)  VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

像这样的东西



0

Laravel手册所述,您可以使用--step选项回滚特定数量的迁移

php artisan migrate:rollback --step=5

只有Laravel 5.3,因此任何低于该版本的编码都无法使用
Jeffz

这在OP的情况下无济于事,因为它将回滚一定数量的迁移,而不是单个指定的迁移。“ --step3”仍将回滚所有3个迁移。
双向飞碟,

0

如果您需要使用相同的迁移多次执行此操作,则可以替代上述方法。我个人认为这为您的迁移增加了很多灵活性。

像这样添加database/migrations到您的自动加载对象中composer.json

"autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories",
            "database/support",
            "database/migrations" // add this line
        ]
    },

然后添加namespace Database\Migrations;到所有迁移文件。

然后运行$ composer dump-autoload以刷新composer.lock文件。

然后,假设迁移的类名是AlterTableWebDirectories,则可以创建如下命令:

$ php artisan make:command DropAlterTableWebDirectories

并在您的handle()方法中编写以下逻辑:

public function handle {
   (new AlterTableWebDirectories)->down();
   DB::raw("delete from migrations where migration like '%alter_table_web_directories%'");
}

这将完全满足您的要求。如果要减少迁移计数而不是删除迁移计数,则可以找出如何更改DB:raw命令。

可以扩展此命令,以允许您通过将参数传递给命令来动态选择要删除的迁移。

然后,当您在阅读以再次迁移该文件时,就可以运行php artisan migrate,它将仅迁移该文件。

此过程使您可以对迁移进行特定更改,而不必每次都进行完全刷新和播种。

我个人需要做很多事情,因为我的种子很大。


0
php artisan migrate:rollback --path=/database/migrations/0000_00_00_0000_create_something_table.php

0

如果您有权访问数据库,则可以使用更简单的解决方案。您可以从迁移表中删除记录,然后删除表。与SQL客户端。

并可以使用

php artisan migrate:rollback --path=... 

喜欢很多答案。并记住路径是位置。您甚至可以像这样删除模块迁移。(从任何地方迁移)

php artisan migrate:rollback --path=Modules/YourModule/database/migrations/2020_05_15_xxxxxx_create_your_table.php

请记住,如果您使用的是Linux服务器,请注意区分大小写。您必须添加/ Database / Migrations之类的开头。

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.