Cambio de migración de Laravel para hacer que una columna sea anulable
Creé una migración con unsigned user_id
. ¿ Cómo puedo editar user_id
en 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();
}
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();
});
}
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;');
}