我有一个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?
答案 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;');
}
希望您会发现此答案有用。 :)