#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