En esta lección aprenderás cómo puedes modificar tablas ya existentes a través del sistema de migraciones de Laravel de dos formas: modificando una migración ya existente o creando una migración nueva. Para lograr esto utilizaremos varios comandos de Artisan como migrate:refresh, migrate:reset y migrate:rollback y por supuesto crearemos la nueva migración con el comando make:migration.
Repositorio
Ver el código de esta lección en GitHub
Notas
Modificar una tabla
Para agregar una columna a una tabla, modificamos la migración ya existente. En nuestro caso añadimos un campo profession con un limite de 100 caracteres a la tabla users:
<?php
//...
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('profession', 100)->nullable(); // Agregamos una nueva columna
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Encadenando nullable() indicamos que la columna puede contener valores nulos, es decir que su valor es opcional.
Comando reset
El comando de Artisan migrate:reset va a hacer un retroceso (roll back) de las migraciones ejecutadas previamente. En nuestro ejemplo va a eliminar las tablas users y password_resets.
# php artisan migrate:reset
Luego de ejecutar este comando, podemos ejecutar el comando php artisan migrate para volver a crear las tablas.
Modificar un campo ya existente
Para modificar un campo ya existente, por ejemplo el limite de caracteres del campo profession, agregamos el nuevo valor en la migración:
<?php
//...
Schema::create('users', function (Blueprint $table) {
// ...
$table->string('profession', 50)->nullable(); // Cambiamos el límite de 100 a 50
// ...
});
Para que estos cambios tengan efecto debemos ejecutar el comando de Artisan migrate:refresh.
Comando migrate:refresh
El comando migrate:refresh primero va a ejecutar un reset de todas las migraciones (llamando al método down()) y luego volverá a ejecutar las migraciones (llamando al método up()):
# php artisan migrate:refresh
Modificar migraciones
Al realizar una modificación en la migración original tenemos el problema de que los comandos reset y refresh eliminaran el contenido de las tablas en la base de datos. Para evitar esto podemos (utilizando el comando make:migration) crear una nueva migración y agregar desde ahí las modificaciones que necesitamos:
# php artisan make:migration add_profession_to_users
Es una buena practica que el nombre de la migración sea descriptivo y haga referencia a lo que vamos a hacer. En este caso add_profession_to_users indica que queremos agregar el campo profession a la tabla users.
Dentro del método up() de la migración en lugar de usar el método create del facade Schema utilizaremos table y pasaremos como primer argumento el nombre de la tabla que queremos modificar:
<?php
//...
Schema::table('users', (Blueprint $table)) {
$table->string('profession', 50)->nullable();
});
Dentro de la función indicamos el campo que queremos agregar.
En el método down() especificamos la acción inversa, en este caso eliminar la columna que agregamos en el método up():
<?php
//...
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('profession');
});
Con el método dropColumn eliminamos de la tabla la columna especificada como argumento.
Indicar la posición de una columna
Al modificar una migración utilizando Schema::table y agregar una columna, esta se va añadir al final de la tabla. Podemos lograr que la columna se cree en la posición que indiquemos utilizando el método after:
<?php
//...
Schema::table('users', function (Blueprint $table)) {
$table->string('profession', 50)->nullable()->after('password');
});
En este caso indicamos que queremos agregar la columna profession después del campo password.
Comando rollback
Utilizando el camando de Artisan migrate:rollback Laravel regresará el último lote de migraciones ejecutado:
# php artisan migrate:rollback
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Introducción a las bases de datos y migraciones con Laravel Lección siguiente Crear y asociar tablas usando las migraciones de Laravel (con claves foráneas)
