如何在Laravel中修改迁移?

时间:2016-12-18 05:45:16

标签: php laravel migration

我试图修改现有的迁移。我的意思是,这是我目前的迁移类:

class CreateLogForUserTable extends Migration
{
    public function up()
    {
        Schema::create('log_for_user', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->string('table_name');
            $table->string('error_message');
            $table->unsignedTinyInteger('error_code');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('log_for_user');
    }
}

我还执行了一次php artisan migrate命令。现在我需要将->nullable()方法添加到error_message列。所以我编辑了我的迁移,如下所示:

.
.
    $table->string('error_message')->nullable();
.
.

但是当我再次执行php artisan migrate时,它会说:

  

无需迁移。

无论如何,我如何应用新版本的迁移?

5 个答案:

答案 0 :(得分:18)

您应该使用命令创建新的迁移:

php artisan make:migration update_error_message_in_log_for_user_table

然后,在该创建的迁移类中,使用change方法添加此行,如下所示:

class UpdateLogForUserTable extends Migration
{
    public function up()
    {
        Schema::table('log_for_user', function (Blueprint $table) {
            $table->string('error_message')->nullable()->change();
        });
    }

    public function down()
    {
        Schema::table('log_for_user', function (Blueprint $table) {
            $table->string('error_message')->change();
        });
    }
}

要进行这些更改并运行迁移,请使用以下命令:

php artisan migrate

要回滚更改,请使用以下命令:

php artisan migrate:rollback

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

php artisan migrate:rollback --step=5
  

详细了解Modifying columns with Migration

答案 1 :(得分:5)

如果您的应用尚未投入生产并且您为数据设定了种子,那么您可以做的最好的就是运行:

php artisan migrate:refresh --seed

此命令将删除所有表并重新创建它们。然后它将播种数据。

如果要在开发期间为每个更改创建其他迁移,最终将有数百个迁移类。

答案 2 :(得分:3)

还有另一种选择。回滚迁移,编辑文件,然后再次运行。

这是在开发新代码中的错误时在本地开发服务器上执行的相当普遍的事情。使用接受的答案中的方法,您可能最终需要进行17次迁移才能创建单个表!

php artisan migrate
# realize you've made an error
php artisan migrate:rollback
# edit your migration file
php artisan migrate

如果需要,可以在命令行上指定要退回的步骤数。

# undo the last 3 migrations
php artisan migrate:rollback --step=3

或者您可以指定需要撤消的特定迁移。

# undo one specific migration
php artisan migrate:rollback --path=./database/migrations/2014_10_12_100000_create_users_table.php

答案 3 :(得分:2)

您可以使用change方法,它允许您将某些现有列类型修改为新类型或修改列的属性。

例如,将列修改为可为空:

Schema::table('log_for_user', function ($table) {
    $table->string('error_message')->nullable()->change();
});

但首先你需要doctrine/dbal

composer require doctrine/dba

答案 4 :(得分:2)

有两种方法可以做到这一点:

  1. 运行php artisan migrate:refresh。这将回滚所有你的 迁移并迁移所有迁移。如果运行此命令, 插入数据库的所有数据都将丢失。
  2. 运行php artisan make:migration enter_your_migration_name_here。 然后在迁移中插入此内容:

    $table->string('error_message')->nullable()->change();

    然后运行php artisan migrate以更改表格。 (请注意,当你这样做时,你的作曲家需要composer require doctrine/dbal