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


126

Estoy escribiendo una migración para hacer ciertas columnas en una tabla en nullableeste momento. Para la función down, por supuesto, quiero hacer esas columnas not nullablenuevamente. Miré a través de los documentos del generador de esquemas , pero no pude encontrar una manera de hacerlo.

Cualquier ayuda sería apreciada.


la respuesta más completa para esta pregunta se puede encontrar aquí: stackoverflow.com/a/32568625/4908847
szaman

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

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

¡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');
    });
}

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();
    });
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.