Laravel数据库:如何“更改” UUID列类型

时间:2018-06-21 23:57:46

标签: laravel

我有一个UUID列类型,它是另一个表的外键,我想使其成为可空值。

$table->uuid('event_id')->nullable()->change();

Laravel文档中包含可以“更改”的列类型列表,并且其中不包含uuid,因此https://laravel.com/docs/5.6/migrations#modifying-columns

数据库是MySQL,创建后,event_id字段是一个char,因此我尝试了以下操作:

$table->char('event_id',36)->nullable()->change();

得到与上面相同的结果(再次,没有真正的惊喜)。

我的问题是:我可以使用Laravel'd DB Schema进行此修改,还是需要诉诸原始SQL?

2 个答案:

答案 0 :(得分:3)

就像枚举列一样,如果要更改现有数据库的uuid,则可能必须使用原始SQL。

我通常会在新的迁移中编写如下代码来处理现有数据库:

if (config('app.env')) === 'production') {
    DB::statement('ALTER ...');
}

然后,我将回到原始迁移并将uuid更改为char。这样,您不必担心原始SQL无法在测试或本地环境中运行(在运行sqlite的情况下)。

答案 1 :(得分:0)

这是将来读者的完整答案。请注意,这仅在Laravel 5+中可行。

首先,您需要教义/ dbal软件包:

作曲者需要学说/ dbal 现在,在迁移中,您可以执行以下操作以使该列可为空:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        // change() tells the Schema builder that we are altering a table
        $table->integer('user_id')->unsigned()->nullable()->change();
    });
}

您可能想知道如何还原此操作。遗憾的是,不支持此语法:

// Sadly does not work :'(

    $table->integer('user_id')->unsigned()->change();

这是还原迁移的正确语法:

$table->integer('user_id')->unsigned()->nullable(false)->change();

或者,如果愿意,可以编写原始查询:

public function down()
{
    /* Make user_id un-nullable */
    DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
    DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

希望您会发现此答案有用。 :)