Laravel: Modificar bases de datos (parte 7)
Archivos/carpetas
- database/migrations
Diferencia entre migrate:fresh y migrate:refresh
El primero ejecuta uno a uno el método down de cada migración, y luego ejecuta uno a uno el método up.
El segundo borra todas las tablas, y ejecuta uno a uno el método up.
Son métodos destructivos, que eliminarían los registros de la base de datos si los hubiera. Por ello vamos a aprender a modificar las tablas in tener que ejecutar estos métodos
Agregar campos a una tabla
Vamos a añadir un campo a nuestra tabla users.
Para practicar esto, añadimos manualmente un registro, con phpmyadmin, a la tabla users, con nombre, contraseña y email.
Creamos una nueva migración, escrita con una convención para facilitarnos las cosas.
php artisan make:migration add_avatar_to_users_table
add_avatar_to_users_table indica que estamos haciendo una migración de añadir una campo lamado avatar a la tabla users. Esto creará un archivo de migración que contiene las siguientes funciones:
public function up()
{
Schema::table('users', function (Blueprint $table) {
//
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
//
});
}
La función up llama a la clase Schema con el método table, que incluye la función con el parámetro del tipo Blueprint con nombre table, para que podamos añadir campos a la tabla. En la función down escribiremos lo necesario para revertir los campos.
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('avatar')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('avatar');
});
}
Hemos usado el método nullable para el campo avatar, indicando que éste puede ser null. Ahora podemos ejecutar la migración con php artisan migrate para ver los cambios.
php artisan migrate
Y vamos a volver a migrar modificando antes el método up de nuestra migración, donde añadimos el método after para colocar el campo donde queremos:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('avatar')->nullable()->after('email');
});
}
El campo está al final de la tabla, donde ya hay registros, y tiene el valor null. Revertimos los cambios con un rollback:
php artisan migrate:rollback
Modificar propiedades de un campo de una tabla
Observamos que el campo name acepta 255 caracteres. Vamos a hacer que sólo acepte 150.
Para este tipo de cambios necesitamos instalar una dependencia, ejecutando este comando en la terminal:
composer require doctrine/dbal
Debemos crear una migración como la que sigue, usando también el nombre por convención:
php artisan make:migration cambiar_propiedades_to_users_table
Ya tenemos nuestro nuevo archivo de migración que, como en el ejercicio anterior, está nombrado por convención para facilitar la escrituradel código.
El siguiente comando ejecuta el método up de cada una de las migraciones, así crearemos las tablas. Desde la consola, migramos. recordamos que para migrar tenemos que ejecutar este comando:
php artisan migrate
El método down eliminará la tabla cuando ejecutemos ciertos comandos de artisan. Modificamos las funciones up y down como sigue, creo que el código se explica solo: estamos usando el método change para cambiar el número de caracteres del campo name de la tabla users, y poniéndolo como estaba en la función down usando el mismo método:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('name', 150)->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->string('name', 255)->change();
});
}
Podemos ejecutar la migración y comprobar los cambios con phpmyadmin. En ningún momento estamos perdiendo datos de la tabla.
Seguimos practicando: añadamos un poco más de código, para hacer que name acepte campos nulos:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('name', 150)->nullable()->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->string('name', 255)->nullable('false')->change();
});
}
Hemos añadido la opción de que el campo name pueda contener valores nulos. para hacer efectivo este nuevo cambio, debemos hacer un rollback y migrar de nuevo.
Recursos
Enlace de Youtube: https://www.youtube.com/watch?v=2pppMAtIlro&list=PLZ2ovOgdI-kWWS9aq8mfUDkJRfYib-SvF&index=11