在 Laravel 5.1 中更新 table 结构而不回滚

Update table structure without rollback in Laravel 5.1

我是 Laravel 的初学者。我使用 migrate 在数据库中创建 tables,但我不想 migrate:rollback 更新我的 table.

我想在我的旧数据库中应用更改而不丢失当前数据。

老迁移

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password', 60);
        $table->rememberToken();
        $table->timestamps();
    });
}

新迁移

   public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('family');
        $table->string('email')->unique();
        $table->string('password', 60);
        $table->rememberToken();
        $table->timestamps();
    });
}

据我所知,这是不可能的,也不是迁移的意图。我认为有两种选择可以解决这个问题:

  1. 如果您不在生产环境中,您可以更改迁移脚本并使用 mysql:

    手动添加额外的列
    alter table users add column family varchar(255);
    
  2. 如果您需要更新生产数据库,您应该添加第二个迁移脚本,只添加额外的列,例如:

    public function up()
    {
        Schema::table('users', function(Blueprint $table)
        {
            $table->string('family')->after('user_id');
        });
    }
    
    public function down()
    {
        Schema::table('users', function(Blueprint $table)
        {
            $table->dropColumn('family');
        });
    }
    

是的,在这种情况下,您可以通过 运行创建一个新的迁移文件来做到这一点

php artisan migrate:make add_family_to_users

这样,将创建一个新的迁移文件,您可以将 family 列与属性一起添加到其中。关于位置,可以用

->after('column name ')

指定新创建的列的前面。例如,在您的情况下,它看起来类似于此

Schema::table('users', function (Blueprint $table) 
{
        $table->string('family')->after('name');
});

最后,重新运行 php artisan migrate 并检查您的 table 是否已添加该列。