Правильный способ построения отношений в модели продолжения

#node.js #sequelize.js

#node.js #sequelize.js

Вопрос:

Недавно мы перешли на Sequelize ORM из Knex, благодаря чему у нас есть существующая база данных, к которой привязаны модели. Все работает нормально, кроме отношений модели.

Итак, у меня есть таблица пользователей и таблица ролей. У каждого пользователя может быть одна роль, но каждая роль может быть назначена многим пользователям. Чтобы сопоставить их с моделями, я создал файлы моделей следующим образом.

Пользовательская модель:

 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, но не имя роли из таблицы roles.

Кто-нибудь может мне помочь в этом, что я здесь делаю неправильно?

Ответ №1:

Вы должны написать условие включения следующим образом

 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 Associations, чтобы узнать больше об ассоциациях и отношениях

Комментарии:

1. Привет, @Arya, теперь я получаю сообщение об ошибке Role is not associated to User .

2. Это означает, что вы на правильном пути, теперь вам нужно связать таблицу ролей с таблицей пользователей, проверьте, есть ли обновленный ответ

3. тем не менее я получаю ту же ошибку Role is not associated to User