Node.JS

Relaciones SQL con Sequelize y Node

En este post te mostraré cómo hacer una relación o asociación entre tablas con el ORM Sequelize para hacer la relación a nivel base de datos y también para traer los datos usando la asociación. Es decir, lo que tiene que ver con foreign key, inner join, left join, etcétera.

Te mostraré cómo insertar datos y solo especificar la clave foránea, contrario a lo que se muestra en la documentación en donde se insertan ambos modelos a la vez.

La razón es porque, por ejemplo, si un trabajador pertenece una oficina, solo importa guardar el id de oficina en caso de que esta ya se haya creado antes, y no se requiere guardar una oficina por cada trabajador.

Declarando modelos

En este caso tengo el modelo Oficina y el modelo Trabajador. Tenemos primero el de la oficina:

// Definimos nuestro modelo
class Oficina extends Model { }
Oficina.init(
    {
        // Los campos del modelo:
        nombre: DataTypes.STRING,
    },
    {
        sequelize: sequelize,
        modelName: "oficina"
    });

// Y lo exportamos
module.exports = Oficina;

Y luego tenemos el de Trabajador. Ahí importamos el de Oficina e indicamos la relación de que un trabajador pertenece a una oficina (belongsTo) así:

// Definimos nuestro modelo
class Trabajador extends Model { }
Trabajador.init(
    {
        // Los campos del modelo:
        nombre: DataTypes.STRING,
    },
    {
        sequelize: sequelize,
        modelName: "trabajadores"
    });
// El trabajador pertenece a una oficina
Trabajador.Oficina = Trabajador.belongsTo(Oficina);

// Y lo exportamos
module.exports = Trabajador;

Ya ahí estamos haciendo la relación. Recuerda que siempre debes invocar a sequelize.sync() para que las tablas sean creadas.

Por cierto, en caso de que modifiques algo, recomiendo eliminar todas las tablas y dejar que el ORM las cree de nuevo.

Ahora al inspeccionar la tabla verás que tienes un nuevo campo. En mi caso, dentro de trabajadores, se agregó la columna oficinaId. El nombre de columna lo da el ORM de Node, Sequelize.

Nota: a lo largo del post voy a omitir las partes en donde se importan los modelos. Por cierto, a veces, en lugar de Trabajador, dirá modeloTrabajador, y lo mismo para Oficina.

Insertando datos

Ahora al insertar indicamos el valor justo como los otros campos. Por ejemplo:

// Nota: es "oficinaId" porque así le llama a la columna Sequelize
const trabajadorRegistrado = await modeloTrabajador.create({
    "nombre": peticion.body.nombre,
    "oficinaId": peticion.body.idOficina,
});

Si te fijas, estoy especificando el id de oficina justo como lo haría con SQL normal. Es decir, no necesito enviar el otro modelo completo, solo la clave foránea que en este caso es oficinaId.

Obteniendo datos

Para obtener datos de Sequelize con la asociación que hemos creado anteriormente, indicamos como argumento a findAll un include con un arreglo que dentro debe tener un objeto indicando la asociación.

En este caso la asociación está dentro de Trabajador.Oficina y el código queda así:

const trabajadores = await modeloTrabajador.findAll({
    // Queremos que incluya la relación "oficina"
    include: [
        {
            association: modeloTrabajador.Oficina
        }
    ]
});

Lo que importa es la asociación que hicimos anteriormente con belongsTo, eso es lo que hace que los objetos se relacionen. La salida en JSON para este caso es:

[
    {
        "id": 13,
        "nombre": "Luis",
        "createdAt": "2020-07-30T04:57:03.202Z",
        "updatedAt": "2020-07-30T04:57:03.202Z",
        "oficinaId": 62,
        "oficina": {
            "id": 62,
            "nombre": "Sala",
            "createdAt": "2020-07-30T01:23:05.265Z",
            "updatedAt": "2020-07-30T01:23:05.265Z"
        }
    },
    {
        "id": 14,
        "nombre": "María",
        "createdAt": "2020-07-30T04:57:20.073Z",
        "updatedAt": "2020-07-30T04:57:20.073Z",
        "oficinaId": 63,
        "oficina": {
            "id": 63,
            "nombre": "Recepción",
            "createdAt": "2020-07-30T04:57:11.350Z",
            "updatedAt": "2020-07-30T04:57:11.350Z"
        }
    }
]

Como puedes ver, tenemos la asociación realizada. Ahora, dentro de cada trabajador, tenemos el objeto oficina.

Te dejo un enlace a la documentación.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

2 semanas hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.