我用unsigned user_id创建了一个迁移。我如何编辑user_id在一个新的迁移,也使它为空()?

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

当前回答

您需要首先安装doctrine/dbal包。

composer require doctrine/dbal

然后使用change()方法 例如:

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id')->nullable()->change();
});

其他回答

如果你碰巧改变了这些列

'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

然后安装

作曲家需要学说

我必须使用nullable(true)

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

Laravel 5现在支持更改列;下面是官方文档中的一个例子:

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

来源:http://laravel.com/docs/5.0/schema changing-columns

Laravel 4不支持修改列,因此您需要使用另一种技术,例如编写原始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();
        });               

}

我假设您正在尝试编辑一个已经添加了数据的列,因此在不丢失数据的情况下,删除列并作为可空列再次添加是不可能的。我们将修改现有的列。

但是,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;');
}

您需要首先安装doctrine/dbal包。

composer require doctrine/dbal

然后使用change()方法 例如:

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id')->nullable()->change();
});