En esta lección del Curso de Laravel desde cero veremos más a fondo el sistema de migraciones de Laravel. En esta oportunidad, te enseñaré cómo crear nuevas tablas y cómo crear asociaciones entre una tabla y otra utilizando claves foráneas. También aprenderás un poco más sobre las convenciones que podemos utilizar al momento de generar nuevas migraciones y sobre otros métodos para definir campos.
Repositorio
Ver el código de esta lección en GitHub
Notas
Convenciones al ejecutar migraciones
Al generar una migración con el comando php artisan make:migration
si utilizamos el siguiente formato para el nombre: create_NOMBRE DE LA TABLA_table
, Laravel automáticamente generará el código requerido para crear dicha tabla:
php artisan make:migration create_professions_table
Producirá el siguiente código boilerplate:
public function up() { Schema::create('professions', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); }); }
Ahora sólo tenemos que definir las columnas.
También podemos pasar la opción --create
en caso de que no queramos usar la convención:
php artisan make:migration new_professions_table --create=professions
A la opción create
pasamos como valor el nombre de la tabla.
Restricción de clave foránea
Podemos añadir una restricción de clave foranea a nuestro campo utilizando el método foreign()
:
Schema::create('users', function (Blueprint $table) { // ... $table->unsignedInteger('profession_id'); $table->foreign('profession_id')->references('id')->on('professions'); // ... });
En este caso indicamos que el campo profession_id
va a hacer referencia al campo id
en la tabla professions
.
Aquí es importante que el tipo del campo profession_id coincida con el campo id en la tabla professions. Es decir el campo profession_id debe ser definido como un entero positivo, para ello usamos el método:
$table->unsignedInteger('nombre_del_campo_aqui');
o $table->integer('nombre_del_campo')->unsigned();
Claves primarias
Cuando diseñamos una base de datos, suele ser importante tener un campo (o combinación de campos) que pueda identificar de manera única a cada fila. Así como tienes un número de pasaporte que es único, cada usuario o profesión va a tener un identificador (id) único. En esta base de datos usaremos identificadores de tipo auto-incremento, es decir la primera fila obtendrá el identificador 1, la segunda 2, y así sucesivamente. Estos identificadores serán generados por el motor de la base de datos.
Claves Foráneas
Para asociar una tabla con otra, vamos a utilizar una clave foránea. Por ejemplo en la tabla de usuarios, utilizaremos el campo profession_id
, cuyo valor va a ser un identificador (id) válido de uno de los registros de la tabla de profesiones. De esta manera asociaremos un registro (fila) la tabla usuarios con un registro (fila) de la tabla de profesiones. En este tipo de relaciones solemos decir que un Usuario pertenece a una Profesión. También podemos decir que una Profesión tiene muchos Usuarios. Puesto que pueden existir 100 usuarios que sean desarrolladores back-end o 50 usuarios que sean desarrolladores front-end, cada profesión va a tener asignada muchos usuarios. Por otro lado cada usuario solo puede tener asignada una profesión (aunque en la vida real hay personas que tienen más de una profesión, en nuestro sistema esto no es relevante).
¿Crear migraciones o modificar las ya existentes?
Para evitar que el número de migraciones crezca sin control, puedes modificar las migraciones ya existentes. Ten en cuenta que esto suele ser posible en etapas tempranas del desarrollo donde la base de datos no existe en producción y todos los datos son de prueba (no importa destruir y reconstruir la base de datos cada vez). Si luego de 3 meses de lanzar tu proyecto debes agregar un campo a la tabla de usuarios, en este caso te recomendaría crear una migración nueva. Porque así no solo podrás modificar la tabla de usuarios (sin eliminarla y recrearla) sino que además mantendrás un historial de los cambios que se han producido en diferentes versiones de tu aplicación.
Cambié una migración y ya nada funciona…
En casos donde ejecutar php artisan migrate:refresh y comandos similares, siempre produzca un error, puedes solucionarlo borrando todas las tablas de tu base de datos o ejecutando php artisan migrate:fresh
.
Ten en cuenta que ejecutar php artisan migrate:fresh va a eliminar todas las tablas. Hazlo solamente si no te importa perder los datos (porque solo son de prueba, etc).
Material Relacionado
- Nuevo comando migrate:fresh en Laravel 5.5
- Variables de entorno en Laravel 5.*
- Curso de programación orientada a objetos con PHP
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Modificar tablas ya existentes con las migraciones de Laravel Lección siguiente Inserción de datos con los seeders de Laravel