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

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

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

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

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