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 determinadoRol
, pero ademas se adjunta la información de la tablaRolMenus
y esto no quiero mostrar en mis resultados, solo quiero obtener los menus relacionados al Rol correspondiente filtrando el campoRolMenus.RM_acceso = 1
.
//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",
});
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;
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;
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;
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP