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

Rollback one specific migration in Laravel

我要

仅回滚:

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 table 都是无意的。我从不希望这种情况发生,如果我只能回滚那个特定的,这场灾难就永远不会发生。

如果您查看 migrations table,您会看到每个迁移都有一个批号。因此,当您回滚时,它会回滚属于最后一批的每个迁移。

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

或者,从 Laravel 5.3 开始,您可以 运行:

php artisan migrate:rollback --step=1

这将回滚最后一次迁移,无论其批号是多少。

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

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

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

像这样

Laravel 5.3+

后退一步。原生。

php artisan migrate:rollback --step=1

这是手册页:docs


Laravel 5.2 之前

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

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

在创建迁移之前创建不同的目录,如下所示:

    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

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

作为 stated in the Laravel manual,您可以使用 --step 选项

回滚特定数量的迁移
php artisan migrate:rollback --step=5

一张一张地迁移表格。

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

运行 migrate:rollback.

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

后退一步。原生。

php artisan migrate:rollback --step=1

回滚两步。原生。

php artisan migrate:rollback --step=2

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

php artisan migrate:rollback --step=1

使用命令 "php artisan migrate:rollback --step=1" 将迁移回退到 1 步。

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

如果要修改原来的迁移文件再进行迁移,可以使用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.) 在数据库中,前往迁移 table 并删除与要删除的 table 相关的迁移条目。

Migration table image example

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

Delete table image example

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

更好用刷新迁移

You may rollback & re-migrate a limited number of migrations by providing the step option to the refresh command. For example, the following command will rollback & re-migrate the last two migrations:

php artisan migrate:refresh --step=2

否则使用回滚迁移

You may rollback a limited number of migrations by providing the step option to the rollback command. For example, the following command will rollback the last three migrations:

php artisan migrate:rollback --step=3

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

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

最坏情况的解决方法(如果你可以访问数据库加上你可以重置table的数据):

  1. 转到数据库并删除/重命名your-specific-migration
  2. 的迁移条目
  3. 删除your-specific-migration
  4. 创建的table
  5. 运行 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

这将 re-run 特定迁移

如果您想回滚上次迁移。

php artisan migrate:rollback

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

php artisan migrate:rollback

目前我正在开发 laravel 5.8 如果无法使用任何其他版本的 laravel 请通知我。

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

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 文件。

然后,假设您的 class 迁移名称是 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 它只会迁移那个文件。

此过程允许您对迁移进行特定更改,而无需每次都进行完全刷新和播种。

我个人需要经常这样做,因为我的种子很大。

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

如果您有权访问数据库,您就有了更简单的解决方案。您可以从 migrations table 中删除记录,然后删除 table。有 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

仅回滚特定迁移非常容易。
由于命令php artisan migrate:rollback,撤消了上次的数据库迁移, 并且迁移执行的顺序存储在 migrations table.

batch 字段中

您可以编辑要回滚的迁移的批次值并将其设置为较高的值。 然后您可以使用简单的方式回滚该迁移:

php artisan migrate:rollback

编辑相同的迁移后,您可以使用简单的命令再次执行它

php artisan migrate

注意:如果两个或多个迁移具有相同的较高值,它们将同时回滚。

您可以使用

php artisan migrate:rollback --path=/database/migrations/timestamp_filename.php

这将删除该特定迁移。如果文件有外键依赖,我希望你使用 drop 方法。对于这些情况,请尝试创建一个新的迁移并在需要时删除外部。

试试这个:

php artisan migrate:rollback --step=1

此作品来自 Laravel 5.3 +