我想要的

仅回退:

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


当前回答

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

将数据库/迁移添加到composer中的自动加载对象中。Json是这样的:

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

然后添加命名空间Database\Migrations;到所有迁移文件。

然后运行$ composer dump-autoload来刷新你的composer。锁文件。

然后,假设你的迁移类名是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,它只会迁移那一个。

这个过程允许您对迁移进行特定的更改,而不必每次都进行完全刷新和播种。

就我个人而言,我需要经常这样做,因为我的种子相当大。

其他回答

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

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

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

php artisan migrate:rollback --step=1

这将回滚最后一次迁移,不管它的批号是什么。

现在回答这个问题可能有点晚了,但我觉得这里有一个非常好的、干净和有效的方法。我会尽量详细的。

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

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

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

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

or

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

or

     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

or

    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

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

除此之外

php artisan migrate:rollback --step=1

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

select * from migrations;

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

如果你不能做到@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,它会删除这个表。 如果你想要回滚它。

回退一步。本机。

php artisan migrate:rollback --step=1

回滚两步。本机。

php artisan migrate:rollback --step=2