TransWikia.com

Cómo aplicar cláusula where en relación belongsToMany con Sequelize

Stack Overflow en español Asked by jeancarlos733 on August 26, 2021

Hola estoy desarrollando una pequeña aplicación en node.js para administrar el acceso
a los menús registrados en mi base de datos. Quiero obtener el listado de Menu que tiene acceso determinado Rol , pero no entiendo cómo aplicar la cláusula WHERE RolMenus.RM_acceso = 1,.

Lo que he realizado es lo siguiente:

const rol = await models.Rol.findByPk(
              1,
              {
                attributes: {
                  exclude: [
                    "Rol_state",
                    "createdAt",
                    "updatedAt",
                    "Rol_nombre",
                  ],
                },
                include: [
                  {
                    model: models.Menu,
                    as: "menus",
                    attributes: [
                      "Menu_principal",
                      "Menu_padre",
                      "Menu_nombre",
                      "Menu_icono",
                      "Menu_ruta",
                      "Menu_state",
                    ],
                  },
/*Para filtrar se me ocurre usar el modelo RolMenu pero devuelve el siguiente error:
EagerLoadingError [SequelizeEagerLoadingError]: RolMenus is not associated to Role!
                  {
                    model: models.RolMenus,
                    where: {
                      RM_acceso: 1,
                    },
                  },
*/
                ],
              }
            );

La consulta devuelve la información de los Menus que se encuentran relacionados con determinado Rol, pero ademas se adjunta la información de la tabla RolMenus y esto no quiero mostrar en mis resultados, solo quiero obtener los menus relacionados al Rol correspondiente filtrando el campo RolMenus.RM_acceso = 1.

introducir la descripción de la imagen aquí

La definición de la base de datos es la siguiente:

introducir la descripción de la imagen aquí

Definición de associations

//NaN -> Roles & RolMenus & Menus
models.Rol.belongsToMany(models.Menu, {
  as: "menus",
  through: "RolMenus",
  foreignKey: "RM_IDrol",
});
models.Menu.belongsToMany(models.Rol, {
  as: "roles",
  through: "RolMenus",
  foreignKey: "RM_IDmenu",
});

Deficinión de modelos

Menu.js

const { sequelize } = require("../../config/db");
const { Model, DataTypes } = require("sequelize");

class Menu extends Model {}
Menu.init(
  {
    Menu_id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    Menu_principal: DataTypes.STRING,
    Menu_padre: DataTypes.STRING,
    Menu_nombre: DataTypes.STRING,
    Menu_icono: DataTypes.STRING,
    Menu_ruta: DataTypes.STRING,
    Menu_state: DataTypes.STRING,
  },
  {
    sequelize,
    modelName: "Menu",
    timestamps: false,
  }
);

module.exports = Menu;

Rol.js

const { Model, DataTypes } = require("sequelize");
const { sequelize } = require("../../config/db");

class Rol extends Model {}
Rol.init(
  {
    Rol_ID: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
    },
    Rol_nombre: DataTypes.STRING,
    Rol_state: DataTypes.INTEGER,
    Rol_read: DataTypes.INTEGER,
    Rol_write: DataTypes.INTEGER,
    Rol_create: DataTypes.INTEGER,
    Rol_update: DataTypes.INTEGER,
    Rol_delete: DataTypes.INTEGER,
  },
  {
    sequelize,
    modelName: "Role",
  }
);

module.exports = Rol;

RolMenu.js

const { Model, DataTypes } = require("sequelize");
const { sequelize } = require("../../config/db");

class RolMenu extends Model {}
RolMenu.init(
  {
    RM_IDrol: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      allowNull: false,
    },
    RM_IDmenu: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      allowNull: false,
    },
    RM_acceso: DataTypes.INTEGER,
  },
  {
    sequelize,
    modelName: "RolMenus",
    timestamps: false,
  }
);

module.exports = RolMenu;

2 Answers

Al final se resolvió agregando el siguiente parámetro throw a la consulta de la siguiente forma:

 const rol = await models.Rol.findByPk(
              1,
              {
                attributes: {
                  exclude: [
                    "Rol_state",
                    "createdAt",
                    "updatedAt",
                    "Rol_nombre",
                  ],
                },
                include: [
                  {
                    model: models.Menu,
                    as: "menus",
                    attributes: [
                      "Menu_principal",
                      "Menu_padre",
                      "Menu_nombre",
                      "Menu_icono",
                      "Menu_ruta",
                      "Menu_state",
                    ],
                    through: {
                      where: {
                        RM_acceso: 0,
                      },
                    },
                  },
                ],
              }
            );

Donde RM_acceso es el campo de validación en la tabla RolMenus que vincula la tabla Roles y la tabla Menus

Y este sería la respuesta final.:

{
    "rol_id": 1,
    "rol_admin": 1,
    "rol_nombre": "Administrador",
    "rol_state": 1,
    "rol_read": 1,
    "rol_write": 1,
    "rol_create": 1,
    "rol_update": 1,
    "rol_delete": 1,
    "menus": [
        {
            "Menu_principal": 1,
            "Menu_padre": 0,
            "Menu_nombre": "Configuracion",
            "Menu_icono": "fa fa-edit",
            "Menu_ruta": "/config",
            "Menu_state": 1,
            "RolMenus": {
                "RM_IDrol": 1,
                "RM_IDmenu": 2,
                "RM_acceso": 0
            }
        }
    ]
}

Answered by jeancarlos733 on August 26, 2021

Yo pensaría que falta la relación de Rol a RolMenu:

Rol.hasMany(RoleMenu, { as: "roleMenus" })

Y después si puedes hacer la consulta haciendo el include correspondiente como lo tienes.

Espero que ayude!

Answered by germanescobar on August 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP