当前位置: 首页 > 知识库问答 >
问题:

Laravel迁移更改使列可为空

席宜修
2023-03-14

我用未签名的用户id创建了一个迁移。如何在新迁移中编辑user\u id,使其也可以nullable()

Schema::create('throttle', function(Blueprint $table)
{
    $table->increments('id');
    // this needs to also be nullable, how should the next migration be?
    $table->integer('user_id')->unsigned();
}

共有3个答案

澹台逸明
2023-03-14

我假设您正试图编辑一个已经添加了数据的列,所以删除该列并将其作为可为空的列再次添加是不可能的,因为它会丢失数据。我们将更改现有列。

但是,Laravel的模式生成器不支持修改列,只支持重命名列。因此,您需要运行原始查询来执行这些操作,如下所示:

function up()
{
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
}

为了确保您仍然可以回滚迁移,我们还将执行down()

function down()
{
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

需要注意的是,由于要在可为空和不可为空之间进行转换,因此需要确保在迁移之前/之后清理数据。因此,在迁移脚本中以两种方式执行此操作:

function up()
{
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
    DB::statement('UPDATE `throttle` SET `user_id` = NULL WHERE `user_id` = 0;');
}

function down()
{
    DB::statement('UPDATE `throttle` SET `user_id` = 0 WHERE `user_id` IS NULL;');
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

束作人
2023-03-14

请注意,这仅在Laravel 5中可能。

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

composer require doctrine/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;');
}
林建本
2023-03-14

Laravel 5现在支持更改列;下面是官方留档的示例:

Schema::table('users', function($table)
{
    $table->string('name', 50)->nullable()->change();
});

资料来源:http://laravel.com/docs/5.0/schema#changing-纵队

Laravel4不支持修改列,因此您需要使用另一种技术,例如编写原始SQL命令。例如:

// getting Laravel App Instance
$app = app();

// getting laravel main version
$laravelVer = explode('.',$app::VERSION);

switch ($laravelVer[0]) {

    // Laravel 4
    case('4'):

        DB::statement('ALTER TABLE `pro_categories_langs` MODIFY `name` VARCHAR(100) NULL;');
        break;

    // Laravel 5, or Laravel 6
    default:                

        Schema::table('pro_categories_langs', function(Blueprint $t) {
            $t->string('name', 100)->nullable()->change();
        });               

}
 类似资料:
  • 问题内容: 我正在编写一个迁移,以立即在表中创建某些列。对于down函数,我当然想再次创建这些列。我浏览了架构生成器docs,但找不到实现此目的的方法。 任何帮助,将不胜感激。 问题答案: 在Laravel 5之前,还没有使用架构生成器来更改现有表列的Laravel本机方式。您需要为此使用原始查询。 但是,从Laravel 5开始,您可以使用:

  • 我正在编写一个迁移,以使表

  • 我有一个已经分配了默认值的表。例如,我们可以查看以下内容: 现在我想更改活动字段的默认值。我期待着做这样的事情: 但它当然告诉我专栏已经在那里了。如何简单地更新x列的默认值而不删除该列?

  • 我正在上进行开发,并在本地环境和生产环境中进行以下迁移。 我想用以下经过调整的字段来更改迁移: 由于我正在生产中使用当前的迁移,我不希望丢失数据。 我只是尝试用我的新表定义修改迁移文件,但我得到了: 有什么建议如何在Laravel适当地改变迁移? 谢谢你的回复!

  • SQLAlchemy变更日志和迁移指南现在集成在主文档中。 当前迁移指南 SQLAlchemy 1.4有什么新功能? SQLAlchemy 2.0概述和状态 迁移到Alchemy 更改日志 1.4变更日志 1.3换热器 1.2换热器 1.1换热器 1换热器 0.9换热器 0.8换热器 0.7换热器 0.6换热器 0.5换热器 0.4换热器 0.3换热器 0.2换热器 0.1换热器 旧的迁移指南 S

  • 问题内容: 我正在尝试学习一些Flask,并且正在使用Flask-Migrate 1.6.0 所以我做了一个看起来像这样的模型 然后我将其更改为完全相同的东西,除了这一行: 当我运行我的 命令,它不会检测列类型的更改。我已经阅读了它,我知道当我更改env.py并添加compare_type = True变量时,它应该将其选中。但是我这样做无济于事,该方法现在看起来像这样 好的,所以我的问题是: 更