在Laravel迁移中使列不可为空


Answers:


226

在Laravel 5之前,还没有使用架构生成器来更改现有表列的Laravel本机方式。您需要为此使用原始查询。

但是,从Laravel 5开始,您可以使用:

$table->...->nullable(false)->change();

1
那也是我发现的。模式构建器可以更改列定义,这似乎并不支持,这很不错。我敢肯定还有很多像我这样的人,他们正在使用架构生成器来修改现有数据库,而不仅仅是从头开始创建表。
肖恩·比恩

3
Taylor Otwell(Laravel的创建者)在6天前(2014年5月9日)说:“我仍然坚持我的说法,即如果有人能够成功干净地做到这一点,我将合并它。” github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan

3
@Musa显然,你可以设置为空的列(如:$table->string('colmn', 255)->nullable()->change();),但相反似乎并没有工作($table->string('colmn', 255)->change();),所以你仍然需要使用原始的数据库查询本
路易斯·克鲁兹

5
请参阅下面的@MattMcDonald答案。您可以使用nullable()将其设置为可空,将nullable(false)设置为在迁移中不可为空。
ajon

5
nullable(false)在Laravel 5.3中对我不起作用:(
Stalinko

38

从Laravel 5开始,可以本机逆转-只需将false作为参数传递给nullable()。

例如

$table -> string('foo') -> nullable(false) -> change();

有用!因此,由于Laravel的更新,这已成为正确的答案。
jlbang

谢谢,尽管我不明白为什么默认情况下不会将列设置为不可为空。这通常是最佳实践,这会增加代码的噪音。
摩根

1
默认情况下,列为非空。发布者只是问如何反转已经为空的列。
Matt McDonald

2

首先运行:

composer require doctrine/dbal

然后创建一个将改变表的迁移,如下所示:

php artisan make:migration fix_whatever_table_name_here

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->nullable(false)->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->dropColumn('column');
    });
}

4
是否有必要在回滚例程中删除整列?down()方法应仅撤消up()方法的逻辑以支持向前和向后滚动迁移。
Andrew

0

您可以再次声明该列而无需-> nullable()并使用-> change

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->type('column')->nullable()->change();
    });
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.