Cambio de migración de Laravel para hacer que una columna sea anulable

Resuelto user391986 asked hace 10 años • 0 respuestas

Creé una migración con unsigned user_id. ¿ Cómo puedo editar user_iden una nueva migración para realizarla también 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();
}
user391986 avatar Jun 26 '14 06:06 user391986
Aceptado

Laravel 5 ahora admite cambiar una columna; Aquí hay un ejemplo de la documentación oficial:

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

Fuente: http://laravel.com/docs/5.0/schema#changing-columns

Laravel 4 no admite la modificación de columnas, por lo que necesitarás utilizar otra técnica, como escribir un comando SQL sin formato. Por ejemplo:

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

}
MURATSPLAT avatar Mar 08 '2015 15:03 MURATSPLAT

Tenga en cuenta que esto sólo es posible en Laravel 5+.

Primero que nada necesitarás el paquete doctrina/dbal :

composer require doctrine/dbal

Ahora, en su migración, puede hacer esto para que la columna sea anulable:

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

Quizás se pregunte cómo revertir esta operación. Lamentablemente esta sintaxis no es compatible:

// Sadly does not work :'(
$table->integer('user_id')->unsigned()->change();

Esta es la sintaxis correcta para revertir la migración:

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

O, si lo prefieres, puedes escribir una consulta sin formato:

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;');
}
Dmitri Chebotarev avatar Sep 14 '2015 15:09 Dmitri Chebotarev