Laravel: bases de datos (parte 6)

Carpetas de esta lección
  • config/database.php
  • .env
  • database/migrations

Creamos base de datos con phpmyadmin

Creamos una base de datos desde phpmyadmin y la llamamos blog, el mismo nombre que nuestro proyecto.

Abrimos el archivo config/database.php.

Ahí está definida el tipo de base de datos con la que nos conectamos, así como otras variables por defecto. El tipo de base de datos está en esta línea:

    'default' => env('DB_CONNECTION', 'mysql'),

Más abajo debemos indicar el host, la base de datos, el usuario, la contraseña. Podemos hacerlo ahí directamente, pero es mejor no hacerlo porque al subirlo a Github quedaría expuesto. Por eso es recomendado hacerlo en el archivo .env, como indica el mismo archivo. Nos podemos quedar con los valores por defecto para este ejercicio, que son los valores que adjudica XAMPP.

Creación de tablas, migraciones

Podemos crear las tablas desde phpmyadmin, mas lo vamos a hacer usando las herramientas de Laravel.

Las migraciones son el control de versiones de la base de datos, así como su estructura. Echemos un vistazo a la migración de database/migrations llamado create_users. Vemos dos funciones públicas, up y down, y nos detendremos en la función up que nos va a crear nuestra tabla con sus columnas:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

La función up llamará a la clase Schema con el método create, con dos parámetros: el nombre de la tabla y una función que recibe como parámetro el objeto de tipo Blueprint llamado $table, y ese objeto llama´ra sucesivamente a varios métodos. Cada uno de ellos tiene unas propiedades muy concretas que las asignará a cada tabla. por ejemplo, el solo hecho de llamar al método id() hará que se cree un campo id que tendrá la propiedad autoincrement, del tipo entero y sin signo.

No nos detendremos de momento a analizar cada uno de los métodos que nos proporciona Laravel para los campos de la tabla, con muchas propiedades distintas y con su utilidad. En la documentación de Laravel tendremos todas las propiedades de las columnas y los métodos.

El siguiente comando ejecuta el método up de cada una de las migraciones, así crearemos las tablas. Desde la consola:

php artisan migrate

El método down eliminará la tabla cuando ejecutemos ciertos comandos de artisan.

Más sobre migraciones

En nuestras base de datos se ha creado una tabla adicional, donde se registran cada una de las migraciones, la tabla migrations. Cada vez que creemos y hagamos nuevas migraciones, se grabará un registro en esta tabla.

Para crear nuestras migraciones, tenemos el siguiente comando:

php artisan make:migration cursos

Así crearemos una nueva migración, con el nombre «cursos». Este comando creará un archivo php con toda la estructura de una migración, incluyendo los métodos up y down (por ahora vacíos) para nuestra migración. En ella podemos crear una tabla o modificar alguna tabla existente.

En el método up, llamamos a la clase Schema, con el método create, que recibe dos parámetros, el nombre de la tabla y una función anónima, que a su vez recibirá un parámetro que es un objeto de tipo Blueprint, instanciado con la variable $table:

public function up()
    {
        Schema::create('cursos', function(Blueprint $table){
            //métodos
        })
    }

Ahora tenemos que llamar a varios de sus métodos, para crear los campos de la tabla. Aquí llamaremos al método id() y al método timestamps() (para crear las tablas created_at y update_at):

    public function up()
    {
        Schema::create('cursos', function(Blueprint $table){
            $table->id();
            $table->timestamps();
        })
    }

Creamos dos columnas más, una para el nombre del curso y otra para la descripción. El campo del nombre puede ser del tipo varchar, así que usamos el método string(), para un campo de máximo 255 caracteres. Necesitamos que el campo de la descripción almacene más de 255 caracteres, por lo que usamos el método text(). A estos dos métodos le pasamos también el nombre de la tabla como parámetro.

    public function up()
    {
        Schema::create('cursos', function(Blueprint $table){
            $table->id(); 
            $table->string('name'); 
            $table->text('description'); 
            $table->timestamps(); 
        });
    }

No podemos olvidar el método down, donde borraremos la tabla en la migración. Para ello usamos de nuevo la clase Schema con el método dropIfExist:

    public function down()
    {
        Schema::dropIfExists('cursos');
    }

Si ejecutamos de nuevo el comando de artisan php artisan migrate podremos crear la nueva tabla. En consola obtendremos esta respuesta:

Migrating: 2022_07_03_102823_cursos
Migrated:  2022_07_03_102823_cursos (47.42ms)

Ojo con la tabla migrations, pues se ha añadido un registro con el campo batch (lote) con el valor 2, el segundo lote de nuestras migraciones. Para eliminar este registro, tenemos que «ir un paso atrás».

Para revertir la última migración, usamos el siguiente comando, rollback. El registro de migrations al que hemos hecho mención se eliminará, y también se ejecutará el método down de la última migración, es decir, se elimnará la nueva tabla.:

php artisan migrate:rollback

De hecho, si volvemos a ejecutar el comando se eliminarán por completo todas las tablas, pues están creadas en el lote 1. Basta con volver a ejecutar php artisan migrate para crear, en esta ocasión, todas a la vez.

En este punto, nos interesa dejar la base de datos vacía, luego eliminar manualmente el archivo de la migración de cursos, y luego migrar de nuevo, pues vamos a crear la tabla cursos de otra forma:

php artisan make:migration create_cursos_table

Si seguimos esta convención, crearemos una migración como anteriormente, con la tabla cursos… pero en esta ocasión Laravel ya incluye los campos id, created at y updated at, y ya rellena el método down:

    public function up()
    {
        Schema::create('cusos', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('cusos');
    }

Ahora sólo nos quedaría añadir manualmente los campos nombre y descripción para nuestra tabla y volver a hacer la migración.

Explicaremos el siguiente comando:

   php artisan migrate:fresh

Ejecuta el método down de cada una de las migraciones, seguido del método up. Es decir, elimina todas la tablas y las vuelve a crear. No es recomendable cuando el proyecto está en producción, porque al eliminar todas las tablas eliminaría también los registros de las mismas. Por eso, si quisiéramos añadir o quitar campos de una tabla o cambiar propiedades de los campos, tenemos otras posibilidades.

Recursos

Enlace de Youtube: https://www.youtube.com/watch?v=C91FOKq7v-k&list=PLZ2ovOgdI-kWWS9aq8mfUDkJRfYib-SvF&index=9