Laravel迁移更改列的默认值

66

我有一个带有默认值的表格。我们可以看以下示例:

Schema::create('users', function (Blueprint $table) {
            $table->increments('id')->unsigned();
            $table->integer('active')->default(1);
        });

我现在想要更改活动字段上的默认值。我希望像这样做:

if (Schema::hasTable('users')) {
        Schema::table('users', function (Blueprint $table) {
            if (Schema::hasColumn('users', 'active')) {
                $table->integer('active')->default(0);
            }
        });
    }

当然,它告诉我列已经存在。如何在不删除列的情况下简单更新列x的默认值?


既然只涉及到一列,你可以通过使用诸如phpmyadmin(xampp)、workbench等界面手动完成操作,这样就不会丢失任何数据。 - Manoj Salvi
这是我目前为止在我们的生产服务器上修复它所做的,但我仍然想知道未来最好的解决方法是什么。否则,我也考虑升级到 Laravel 5。 - Brendan Van Der Merwe
这里有一个链接可能会对你有所帮助 - http://www.flipflops.org/2013/05/25/modify-an-existing-database-column-in-a-laravel-migration/ - Manoj Salvi
似乎在我的迁移脚本中使用原始查询是正确的方法。真的以为我在这里错过了什么明显的东西。 - Brendan Van Der Merwe
是的,它可以两种方式都行——将修改查询语句编写在现有迁移中或在新创建的迁移中。 - Manoj Salvi
3个回答

113

你可以使用 change() 方法:

Schema::table('users', function ($table) {
    $table->integer('active')->default(0)->change();
});

然后运行migrate命令。

更新

对于Laravel 4,可以使用类似以下的方式:

DB::statement('ALTER TABLE `users` CHANGE COLUMN `active` `active` INTEGER NOT NULL DEFAULT 0;');

up()方法中,使用Schema::table();语句。


抱歉,我忘记提到了,我正在使用 Laravel 4.2。 - Brendan Van Der Merwe
对于 Laravel 4,您应该使用原始查询。请查看更新的问题。 - Alexey Mezenin
2
要从列中删除默认值,请使用default(NULL)。 - Derrick Miller
@AlexeyMezenin:你好,我使用了你的代码去改变数据库列,成功迁移,但是数据库列没有发生改变!你有什么想法吗?谢谢。 - Hiren Gohel
1
@rüff0 $table->integer('active')->default(1)->change();@rüff0 $table->integer('active')->default(1)->change(); - sinaza
显示剩余3条评论

6

您需要调用更改函数来更新列

if (Schema::hasTable('users')) {
    Schema::table('users', function (Blueprint $table) {
        if (Schema::hasColumn('users', 'active')) {
            $table->integer('active')->default(0)->change();
        }
    });
}

抱歉,我忘记提到了,我正在使用 Laravel 4.2。 - Brendan Van Der Merwe

-2
创建新的迁移文件,并使用change()函数。
if (Schema::hasTable('users')) {
    Schema::table('users', function (Blueprint $table) {
        if (Schema::hasColumn('users', 'active')) {
            $table->integer('active')->default(0)->change();
        }
    });
}

同时确保将 doctrine/dbal 依赖项添加到您的 composer.json 文件中。


“刷新”不会更改任何默认值,它只是重置了所有内容。 - Salam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接