在Laravel

时间:2015-05-17 14:29:42

标签: laravel laravel-4 laravel-5 database-migration

我想要

仅回滚:

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

19 个答案:

答案 0 :(得分:172)

Laravel 5.3 +

回滚一步。本身。

php artisan migrate:rollback --step=1

这是手册页:docs

Laravel 5.2和之前

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

答案 1 :(得分:103)

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

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

答案 2 :(得分:19)

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

php artisan migrate:rollback --step=1

答案 3 :(得分: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,它将删除该表。 如果你又想要那回来就回滚它。

答案 4 :(得分: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

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:4)

回滚一步。本身。

php artisan migrate:rollback --step=1

回滚两步。本身。

php artisan migrate:rollback --step=2

答案 7 :(得分:3)

逐个迁移表格。

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

运行migrate:rollback。

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

答案 8 :(得分: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

答案 9 :(得分:2)

更好地使用刷新迁移

  

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

php artisan migrate:refresh --step=2

否则使用了回滚迁移

  

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

php artisan migrate:rollback --step=3

有关迁移see

的更多详细信息

答案 10 :(得分:1)

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

类似这样的事情

答案 11 :(得分:1)

如果要回滚上一次迁移。

php artisan migrate:rollback

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

php artisan migrate:rollback

当前我正在使用laravel 5.8,如果不能使用其他版本的laravel,请通知我。

答案 12 :(得分:1)

如果您有权访问数据库,则可以找到更简单的解决方案。您可以从 migrations 表中删除记录,然后仅删除表。使用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

答案 13 :(得分:0)

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

php artisan migrate:rollback --step=5

答案 14 :(得分:0)

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

Migration table image example

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

Delete table image example

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

答案 15 :(得分:0)

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

最坏情况的解决方法(如果您可以访问数据库,并且可以对该表的数据进行重置就可以了)

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

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

答案 16 :(得分: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,它将仅迁移该文件。

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

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

答案 17 :(得分:0)

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

答案 18 :(得分:0)

回滚一个特定的迁移非常容易。
由于命令php artisan migrate:rollback,请撤消上一次数据库迁移, 并且迁移执行的顺序存储在batch表的migrations字段中。

您可以编辑要回滚的迁移的批处理值,并将其设置为更高的值。 然后,您可以使用以下简单的方法回滚该迁移:

php artisan migrate:rollback

在编辑完相同的迁移后,您可以通过简单的操作再次执行

php artisan migrate

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