tabla - Cambio de migración de Laravel y hacer que la columna sea nulable
instalar migraciones laravel (9)
Creé una migración con user_id unsigned. ¿Cómo puedo editar user_id en una nueva conexión para que también sea nullable()
?
Schema::create(''throttle'', function(Blueprint $table)
{
$table->increments(''id'');
$table->integer(''user_id'')->unsigned(); // this needs to also be nullable, how should the next migration be?
}
Él es la migración completa de Laravel 5 :
public function up()
{
Schema::table(''users'', function (Blueprint $table) {
$table->unsignedInteger(''user_id'')->nullable()->change();
});
}
public function down()
{
Schema::table(''users'', function (Blueprint $table) {
$table->unsignedInteger(''user_id'')->nullable(false)->change();
});
}
El punto es que puedes eliminar nullable
pasando false
como argumento.
Añadiendo a la respuesta de Dmitri Chebotarev, como para Laravel 5+.
Después de requerir el paquete doctrine / dbal :
composer require doctrine/dbal
A continuación, puede realizar una migración con columnas que aceptan valores numéricos, así:
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();
});
}
Para revertir la operación, hazlo:
public function down()
{
/* turn off foreign key checks for a moment */
DB::statement(''SET FOREIGN_KEY_CHECKS = 0'');
/* set null values to 0 first */
DB::statement(''UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;'');
/* alter table */
DB::statement(''ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;'');
/* finally turn foreign key checks back on */
DB::statement(''SET FOREIGN_KEY_CHECKS = 1'');
}
Agregando a Dmitri Chebotarev Respuesta,
Si desea modificar varias columnas a la vez, puede hacerlo como a continuación
DB::statement(''
ALTER TABLE `events`
MODIFY `event_date` DATE NOT NULL,
MODIFY `event_start_time` TIME NOT NULL,
MODIFY `event_end_time` TIME NOT NULL;
'');
Aquí está la respuesta completa para el futuro lector. Tenga en cuenta que esto solo es posible en Laravel 5+.
Antes que nada necesitarás el paquete doctrine / dbal :
composer require doctrine/dbal
Ahora en su migración puede hacer esto para que la columna sea nulable:
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();
});
}
Puede que 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 prefiere, puede 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;'');
}
Espero que encuentres útil esta respuesta. :)
Intentalo:
$table->integer(''user_id'')->unsigned()->nullable();
Laravel 5 ahora admite cambios de columna.
Ejemplo de documento 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 columna. Tienes que escribir el comando raw sql.
// getting Laravel App Instance
$app = app();
// getting laravel main version
$laravelVer = explode(''.'',$app::VERSION);
switch ($laravelVer[0]) {
case(''5'') :
Schema::table(''pro_categories_langs'', function(Blueprint $t) {
$t->string(''name'', 100)->nullable()->default(null)->change();
});
break;
/**
* it is not L5 !!
*/
default :
DB::statement(''ALTER TABLE `pro_categories_langs` MODIFY `name` VARCHAR(100) NULL;'');
}
Para Laravel 4.2, la respuesta de Unnawut anterior es la mejor. Pero si usa el prefijo de tabla, entonces necesita modificar su código un poco.
function up()
{
$table_prefix = DB::getTablePrefix();
DB::statement(''ALTER TABLE `'' . $table_prefix . ''throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;'');
}
Y para asegurarnos de que aún pueda revertir su migración, también haremos el down()
.
function down()
{
$table_prefix = DB::getTablePrefix();
DB::statement(''ALTER TABLE `'' . $table_prefix . ''throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;'');
}
Si sucede que cambia las columnas y se tropezó con
''Doctrine/DBAL/Driver/PDOMySql/Driver'' not found
entonces solo instala
composer require doctrine/dbal
Supongo que está intentando editar una columna en la que ya ha agregado datos, por lo que no se puede eliminar la columna y agregarla nuevamente como una columna que admite valores NULL sin perder datos. alter
la columna existente.
Sin embargo, el generador de esquemas de Laravel no admite la modificación de columnas que no sea cambiar el nombre de la columna. Por lo tanto, deberá ejecutar consultas crudas para hacerlas, como esta:
function up()
{
DB::statement(''ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;'');
}
Y para asegurarnos de que aún pueda revertir su migración, también haremos el down()
.
function down()
{
DB::statement(''ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;'');
}
Una nota es que, dado que está convirtiendo entre nulos y nulos, deberá asegurarse de limpiar los datos antes o después de la migración. Así que hazlo en tu script de migración en ambos sentidos:
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;'');
}