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

431027 次浏览

如果你查看你的migrations表,那么你会看到每次迁移都有一个批批号。因此,当您回滚时,它将回滚上一批中的每个迁移。

如果您只想回滚最后一次迁移,那么只需将批批号增加1。然后下次运行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');
});
}

,然后运行migrate,它将删除表。 如果你想要回滚它。

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

这里是手册页:文档


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

使用这些技术将使您能够更灵活地控制数据库以及对模式的任何修改。

作为Laravel手册中提到的,你可以使用--step选项回滚特定数量的迁移

php artisan migrate:rollback --step=5

逐个迁移表。

将需要回退的迁移批号修改为最高。

运行迁移:回滚。

这可能不是处理大型项目的最佳方式。

回退一步。本机。

php artisan migrate:rollback --step=1

回滚两步。本机。

php artisan migrate:rollback --step=2

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

php artisan migrate:rollback --step=1

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

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

如果你想修改原始的迁移文件并再次迁移它,你可以使用这个包来迁移。(适用于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)。在数据库中,转到迁移表并删除与要删除的表相关的迁移条目。

迁移表镜像示例 .

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

删除表图像示例 .

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

最好使用刷新迁移

你可以回滚&对有限数量的迁移进行重新迁移 为刷新命令提供step选项。例如, 以下命令将回滚&重新迁移最后两次迁移:

php artisan migrate:refresh --step=2

否则使用回滚到

您可以通过提供step回滚有限数量的迁移 选项。例如,下面的命令

php artisan migrate:rollback --step=3

有关迁移看到的更多细节

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

最坏情况的解决方案(如果你可以访问DB加上你可以对该表的数据进行RESET):

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

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

< em >更新: Laravel方式(谢谢,@thiago-valente)

运行:

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

然后:

php artisan migrate

这将重新运行特定的迁移

如果要回滚上次迁移。

php artisan migrate:rollback

如果你想回滚特定的迁移,然后转到迁移表并批量设置该记录的最大值。 然后。< / p >

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

然后,假设迁移的类名是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

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

或者可以使用

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

就像很多答案一样。记住路径是Location。您甚至可以像这样删除模块迁移。(从任何地方迁移)

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

记住,如果你使用的是linux服务器,小心区分大小写。你必须添加像/数据库/迁移开头的大写字母。

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
只回滚一个特定的迁移是很容易的。
由于命令php artisan migrate:rollback,撤销上次数据库迁移, 迁移执行的顺序存储在migrations表的batch字段中

您可以编辑要回滚的迁移的批处理值,并将其设置为较高者。 然后,您可以使用简单的

回滚该迁移
php artisan migrate:rollback

在编辑相同的迁移之后,可以使用简单的

php artisan migrate

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

你可以使用

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

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

试试这个:

php artisan migrate:rollback --step=1

这是从Laravel 5.3 +工作

除此之外

php artisan migrate:rollback --step=1

我将在表迁移中添加一个检查:

select * from migrations;

这将显示一个有序的列表,其中包含artisan命令回滚的迁移。