ChatGPT解决这个技术问题 Extra ChatGPT

在 Laravel 迁移中使列不可为空

我现在正在编写迁移以在表 nullable 中创建某些列。对于向下功能,我当然想再次制作这些列 not nullable。我查看了 schema builder docs,但找不到执行此操作的方法。

任何帮助,将不胜感激。

可以在此处找到此问题的最完整答案:stackoverflow.com/a/32568625/4908847

D
Daniel Dewhurst

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

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

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

在运行上述命令之前,您必须具有 dbal 依赖项:

composer require doctrine/dbal

这也是我发现的。对于架构构建器来说,一个不错的选择是允许更改它似乎不支持的列定义。我敢肯定还有很多像我这样的人正在使用模式构建器来修改现有数据库,而不仅仅是从头开始创建表。
Taylor Otwell(Laravel 的创建者)6 天前(2014-05-09)表示:“我仍然坚持我的声明,如果有人能够成功且干净地做到这一点,我将合并它。” github.com/laravel/framework/issues/895#issuecomment-42709756
@Musa 显然你可以设置一个可以为空的列(例如:$table->string('colmn', 255)->nullable()->change();),但反过来似乎不起作用($table->string('colmn', 255)->change();),所以你仍然需要为此使用原始数据库查询
请参阅下面的@MattMcDonald 的回答。您可以使用 nullable() 使其可空,使用 nullable(false) 使其在迁移中不可为空。
nullable(false) 在 Laravel 5.3 中对我不起作用 :(
M
Matt McDonald

从 Laravel 5 开始,可以通过将 false 作为参数传递给 nullable 来扭转这种情况。

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

有用!因此,由于 Laravel 的更新,这已成为正确答案。
谢谢,虽然我不明白为什么默认情况下不能使列不可为空。这通常是最佳实践,这会给代码增加很多噪音。
默认情况下,列是非空的。发帖人只是在询问如何反转已经为空的列。
必须先composer require doctrine/dbal
M
Matt McDonald

首先运行这个:

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();
    });
}

# Optional:
# public function down()
# {
#     Schema::table('table_name', function ($table) {
#         $table->type('column')->nullable()->change();
#     });
# }

是否有理由在回滚例程中删除整个列? down() 方法应该只是撤消 up() 方法的逻辑以支持向后和向前滚动迁移。
G
Gabriel Fernandez

您可以在没有 ->nullable() 的情况下再次声明该列并使用 ->change

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->type('column')->nullable()->change();
    });
}

谢谢,它对我有用。我的情况正好相反。我想在 down 函数中使该列不可为空。
S
Sylar

在 laravel 8 中,您只需输入:“->nullable()”

$table->string('name')->nullable();