在Laravel中回滚一个特定的迁移

问题描述 投票:160回答:13

I want

仅回滚:

Rolled back: 2015_05_15_195423_alter_table_web_directories


I run

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

I delete

无意中我的web_directories和我的contacts表。我从来不希望这种情况发生,如果我只能回滚那个特定的灾难,那么这场灾难将永远不会发生。

laravel laravel-4 laravel-5 database-migration
13个回答
108
投票

如果您查看migrations表,那么您将看到每个迁移都有一个批号。因此,当您回滚时,它会回滚作为最后一批的一部分的每次迁移。

如果您只想回滚最后一次迁移,则只需将批次编号增加一。然后,下次运行rollback命令时,它将仅回滚那个迁移,因为它在自己的“批处理”中。


2
投票

如果要修改原始迁移文件并再次迁移,可以使用this package进行迁移。 (适用于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

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

这样的事情


0
投票

作为stated in the Laravel manual,您可以使用--step选项回滚特定数量的迁移

php artisan migrate:rollback --step=5

0
投票

1.)在数据库内部,转到迁移表并删除与要删除的表相关的迁移条目。

Migration table image example

2.)接下来,从指令1中删除与刚刚删除的迁移相关的表。

Delete table image example

3.)最后,对您从指令号中删除的表的迁移文件进行所需的更改。 2然后运行php artisan migrate再次迁移表。


0
投票

最好的方法是创建一个新的迁移并进行必要的更改。

最糟糕的情况解决方法(如果您可以访问数据库加上您可以使用该表的数据重置):

  1. 转到DB并删除/重命名your-specific-migration的迁移条目
  2. 删除your-specific-migration创建的表格
  3. 运行php artisan migrate --path=/database/migrations/your-specific-migration.php

这将强制laravel运行特定的迁移,因为Laravel的迁移历史记录中不存在任何条目


184
投票

Laravel 5.3+

回滚一步。本身。

php artisan migrate:rollback --step=1

这是手册页:docs


Laravel 5.2 and before

没有麻烦也没办法。有关详细信息,请查看Martin Bean的answer


19
投票

每次回滚都会得到最后一批迁移。使用该命令

php artisan migrate:rollback --step=1

16
投票

如果你不能做@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');
    });
}

然后运行migrate,它将删除该表。如果你又想要那回来就回滚它。


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

使用这些技术可以更灵活地控制数据库以及对模式所做的任何修改。


4
投票

回滚一步。本身。

php artisan migrate:rollback --step=1

回滚两步。本身。

php artisan migrate:rollback --step=2

4
投票

使用命令“php artisan migrate:rollback --step = 1”将回滚迁移回1步。

有关更多信息,请查看链接: - https://laravel.com/docs/master/migrations#running-migrations


4
投票

更好地使用刷新迁移

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

php artisan migrate:refresh --step=2

否则使用回滚迁移

您可以通过向rollback命令提供步骤选项来回滚有限数量的迁移。例如,以下命令将回滚最后三次迁移:

php artisan migrate:rollback --step=3

有关迁移see的更多详细信息


3
投票

逐个迁移表。

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

运行migrate:rollback。

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

© www.soinside.com 2019 - 2024. All rights reserved.