Node.js sequelize模型中处理关系的正确方法

Node.js sequelize模型中处理关系的正确方法,node.js,sequelize.js,Node.js,Sequelize.js,最近,我们从Knex开始对ORM进行续集,因为我们有模型映射到的现有数据库。除模型关系外,一切正常 所以我有一个用户表和角色表。每个用户可以有一个角色,但每个角色可以分配给多个用户。为了将这些映射到模型,我创建了如下的模型文件 用户模型: const Sequelize = require('sequelize'); const sequelize = require('../utility/dbConnection'); const roles = require('./Roles'); mo

最近,我们从Knex开始对ORM进行续集,因为我们有模型映射到的现有数据库。除模型关系外,一切正常

所以我有一个用户表和角色表。每个用户可以有一个角色,但每个角色可以分配给多个用户。为了将这些映射到模型,我创建了如下的模型文件

用户模型:

const Sequelize = require('sequelize');
const sequelize = require('../utility/dbConnection');
const roles = require('./Roles');
module.exports = sequelize.define("User", {
    id: {
        type: Sequelize.INTEGER(11),
        primaryKey: true,
        autoIncrement: true,
        allowNull: false
    },
    firstName: Sequelize.STRING(255),
    middleName: Sequelize.STRING(255),
    lastName: Sequelize.STRING(255),

    email: {
        type: Sequelize.STRING(255),
        unique: true
    },
    phoneNumber: {
        type: Sequelize.STRING(255),
        unique: true
    },
    is_phonenumber_verified: {
        type: Sequelize.BOOLEAN,
        default: false
    },
    is_email_verified: {
        type: Sequelize.BOOLEAN,
        default: false
    },

    roleID: {
        type: Sequelize.INTEGER
    },



    password: Sequelize.STRING(255)

    // }, {
    //     defaultScope: {
    //         attributes: { exclude: ['password'] }
    //     }
}, {
    tableName: 'users'
},{
    classMethods: {
        associate: function() {
          this.hasOne(roles,{foreignKey: 'roleID'})
        }
    }
}
 
);

角色模型:

const Sequelize = require('sequelize');
const sequelize = require('../utility/dbConnection');
module.exports = sequelize.define("Role", {
    id: {
        type: Sequelize.INTEGER(11),
        primaryKey: true,
        autoIncrement: true,
        allowNull: false
    },
    name: {
        type: Sequelize.STRING(255),
        unique: true
    },

},{
    tableName: 'roles'
});
现在在控制器文件中,我想获取用户详细信息和角色名称,其代码片段如下

const userModel = require('../../models/Users');
const rolesModel = require('../../models/Roles');
 let user = await userModel.findOne({ where: { email: req.body.email } },{include:[{model:rolesModel}]});
问题是它只从Users表中获取rolesID,而不从roles表中获取roles名称


有人能帮我解释一下我做错了什么吗?

你必须这样写你的包含条件

const userModel = require('../../models/Users');
const rolesModel = require('../../models/Roles');
let user = await userModel.findOne({
where: {
    email: req.body.email
},include:
        [{ model: rolesModel }]
});
您可以使用
belongsTo
关系,而不是使用
hasOne
在“角色”表中添加此关系,并从“用户”表中删除

 classMethods: {
    associate: function() {
      this.belongsTo(users,{foreignKey: 'roleID'})
    }
}

您可以查看此Sequelize docs以了解更多有关关联和关系的信息

Hey@Arya now我收到一个错误
角色未与用户关联
。这意味着您走对了,现在您必须将角色表与用户表关联检查我已更新答案仍然我收到相同的错误
角色未与用户关联用户