Hacer que la columna no sea anulable en una migración de Laravel

Respuestas:

227

Antes de Laravel 5 no había una forma nativa de Laravel de alterar una columna de tabla existente utilizando el generador de esquemas. Tendría que usar consultas sin procesar para esto.

Sin embargo, a partir de Laravel 5 puede usar:

$table->...->nullable(false)->change();
TLGreg
fuente
1
Eso es lo que encontré también. Un buen toque para el generador de esquemas permitiría alterar las definiciones de columna, que no parece admitir. Estoy seguro de que hay muchos otros como yo que están utilizando el generador de esquemas para modificar una base de datos existente, no solo para crear tablas desde cero.
Sean the Bean el
3
Taylor Otwell (creador de Laravel) dijo hace 6 días (2014-05-09): "Todavía mantengo mi afirmación de que si alguien puede hacerlo con éxito y de manera limpia, la fusionaré". github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan
3
@Musa Aparentemente, puede establecer una columna anulable (ej .:) $table->string('colmn', 255)->nullable()->change();pero al revés no parece funcionar ( $table->string('colmn', 255)->change();), por lo que aún necesita usar consultas de db sin procesar para esto
Luís Cruz
55
Vea la respuesta de @ MattMcDonald a continuación. Puede usar nullable () para que sea nullable y nullable (false) para que no sea nullable en una migración.
ajon
55
nullable(false)no funciona para mí en Laravel 5.3 :(
Stalinko
38

A partir de Laravel 5, es posible revertir esto de forma nativa: simplemente pase false como argumento a nullable ().

p.ej

$table -> string('foo') -> nullable(false) -> change();
Matt McDonald
fuente
¡Funciona! Así que esta se ha convertido en la respuesta correcta debido a las actualizaciones de Laravel.
jlbang
Gracias, aunque no entiendo por qué las columnas no se pueden anular de forma predeterminada. Por lo general, es una práctica recomendada y esto agrega mucho ruido al código.
Morgan
1
Las columnas no son nulas de forma predeterminada. El póster solo preguntaba cómo invertir una columna ya nula.
Matt McDonald
2

Primero ejecuta esto:

composer require doctrine/dbal

Luego cree una migración que alterará la tabla de la siguiente manera:

php artisan make:migration fix_whatever_table_name_here

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->nullable(false)->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->dropColumn('column');
    });
}
funerr
fuente
44
¿Hay alguna razón para descartar la columna completa en la rutina de reversión? El método down () debería deshacer la lógica del método up () para admitir migraciones sucesivas hacia adelante y hacia atrás.
Andrew
1

Puede declarar la columna nuevamente sin -> nullable () y usar -> cambiar

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->type('column')->nullable()->change();
    });
}
Gabriel Fernández
fuente