Laravel incluye un sistema de migraciones de base de datos con el cual podemos definir todas las tablas de nuestra aplicación desde PHP, utilizando una interfaz orientada a objetos. Este sistema nos da la ventaja de que podemos guardar las diferentes «versiones» de nuestra base de datos como código dentro del sistema de control de versiones (por ejemplo git), además nos permite generar tablas para diferentes bases de datos (MySQL, PostgreSQL, SQLite, y SQL Server) usando el mismo código PHP.
En esta lección aprenderás cómo generar, modificar y ejecutar una migración para crear tu primera tabla con Laravel.
Mira el código en GitHub: actual, resultado, comparación.
Las migraciones de Laravel no son más que archivos de PHP ubicados en el directorio database/migrations
. Tu aplicación viene con 3 migraciones por defecto, las cuales puedes modificar o eliminar.
La primera migración trae lo necesario para crear la tabla donde se guardará la información de cada usuario incluyendo su email y contraseña. La segunda es la migración que utiliza Laravel para guardar la información para la recuperación de contraseñas y la tercera es un poco más avanzada y la veremos luego.
También podemos generar una nueva migración desde la consola con el comando php artisan make:migration
seguido del nombre de la migración, por ejemplo:
# php artisan make:migration create_notes_table
El nombre create_notes_table
es una convención: create_[NOMBRE DE LA TABLA AQUÍ]_table
, Laravel comprende esto y nos genera el boilerplate necesario para definir nuestra nueva tabla de notas:
<?php //... class CreateNotesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('notes', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('notes'); } }
Nota que hay dos métodos: up
y down
:
- Desde el método
up
definiremos la acción principal de nuestra migración, que en este caso es la creación de la tabla notas - En el método
down
definiremos la acción contraria, en este caso la eliminación de la tabla de notas. Este método es opcional.
No todo el tiempo el método up
se encargará de crear tablas. Si agregas una migración para eliminar una tabla las acciones deberían quedar al revés: en up
tendrías que eliminar la tabla y en down
recrearla tal como estaba antes de su eliminación.
Exploremos el código del método up
a detalle:
<?php //... public function up() { Schema::create('notes', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); }); }
Aquí se llama al método create
dentro del «Facade» Schema
.
Recuerda que los Facades en Laravel nos permiten interactuar con componentes registrados en el framework a través de una interfaz estática; pero realmente no hay un método create
dentro de esta clase Schema
. Más adelante exploraremos este concepto con calma.
Este método create
acepta 2 argumentos, el primero es el nombre de la tabla que será creada, el segundo es una función anónima o Closure:
<?php function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); }
Esta función anónima va a recibir un objeto de la clase Illuminate\Database\Schema\Blueprint
y es este último objeto el que contiene los métodos para definir los campos de la tabla, por ejemplo:
$table->bigIncrements('id');
define una columna de tipo BIGINT UNSIGNED, es decir, entero grande sin números negativos.$table->timestamps();
define 2 columnas de tipoTIMESTAMP
con los nombrescreated_at
yupdated_at
, estas columnas son usadas por Eloquent, el ORM de Laravel que veremos más adelante.
Vamos a agregar 2 columnas más en el medio:
$table->string('title');
define una columna de tipoVARCHAR
con el nombretitle
$table->mediumText('content');
define una columna de tipoMEDIUMTEXT
con el nombrecontent
Por ahora esto es todo lo que necesitamos para crear la versión inicial de nuestra tabla de notas.
Antes de ejecutar nuestras migraciones debemos crear una base de datos y configurar el archivo .env
en el directorio principal de nuestro proyecto.
- Puedes crear una base de datos utilizando tu administrador de DB preferido, ya yo he creado una llamada
curso_laravel_styde
- A continuación, debes abrir el archivo
.env
en el directorio principal de tu proyecto y asegurarte de configurar los siguientes valores (es posible que algunos de los valores por defecto sean los correctos):- DB_CONNECTION
- DB_HOST
- DB_PORT
- DB_DATABASE
- DB_USERNAME
- DB_PASSWORD
Una vez creada y configurada la DB, ejecuta el comando php artisan migrate
en la consola. Deberías ver los siguientes mensajes:
Solamente falta que revises las tablas creadas en tu administrador de base de datos favorito, yo uso phpMyAdmin en mis cursos porque es bastante común y está disponible desde cualquier navegador:
Problemas comunes al ejecutar las migraciones
Si recibes un error y no se ha creado ninguna tabla, es posible que no hayas configurado tu base de datos correctamente. En dado caso regresa al archivo .env
y arregla los valores.
Si el error ocurrió luego de que se creara al menos una de las tablas es posible que hayas definido una migración incorrectamente. Arregla el código y luego re-ejecuta el comando php artisan migrate
.
Alternativamente puedes ejecutar php artisan migrate:fresh
para borrar todas las tablas y ejecutar las migraciones de nuevo y desde cero.
Debes tener cuidado con comandos como php artisan migrate:fresh
que ejecutan acciones destructivas como eliminar todas las tablas de tu base de datos, este comando en particular es bastante útil en desarrollo pero sería desastroso ejecutarlo en un servidor de producción.
Cómo revertir las migraciones ejecutadas
Por último, puedes ejecutar el comando php artisan migrate:rollback
para revertir las migraciones. Este comando ejecutará todos los métodos down
de cada migración en el orden inverso en el que fueron ejecutadas previamente. En nuestro ejemplo deberás ver cómo se eliminan las tablas creadas previamente; a excepción de la tabla migrations que Laravel utiliza para llevar el control de las migraciones que ya han sido ejecutadas y el orden en que fueron ejecutadas.
Si deseas usar el comando migrate:rollback
, asegúrate de agregar la lógica para revertir la migración en el método down()
.
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Generar URLs con Laravel 6 Lección siguiente Insertar datos en la base de datos con los Seeders de Laravel