gpt4 book ai didi

sequelize.js - 使用 Sequelize 关联模型的方法是否正确?

转载 作者:行者123 更新时间:2023-12-03 22:32:03 25 4
gpt4 key购买 nike

我用表 UsersRoles 创建一个关系 N:N ,生成第三个表 UserRole
在这种关系中运行 findAll 我收到一条消息,其中 SequelizeEagerLoadingError: UserRole is not associated to User!这就是我定义模型的方式:
用户:

const { Model } = require("sequelize");

module.exports = (sequelize, DataTypes) => {
class User extends Model { };

User.associate = (models) => {
User.belongsToMany(models.Role, { through: models.UserRole });
}

User.init({
username: DataTypes.STRING,
password: DataTypes.STRING,
}, { sequelize, modelName: "User" })

return User;
}
角色:
const { Model } = require("sequelize");

module.exports = (sequelize, DataTypes) => {
class Role extends Model { }

Role.associate = (models) => {
Role.belongsToMany(models.User, { through: models.UserRole });
};

Role.init({
name: DataTypes.STRING
}, { sequelize, modelName: 'Role' });

return Role
}
用户角色:
const { Model } = require("sequelize");

module.exports = (sequelize, DataTypes, models) => {
class UserRole extends Model { }

UserRole.init({
user_id: {
type: DataTypes.INTEGER,
references: {
model: Model.User,
key: 'id'
}
},
role_id: {
type: DataTypes.INTEGER,
references: {
model: Model.Role,
key: 'id'
}
}
}, { sequelize, modelName: "UserRole" });

return UserRole
}

最佳答案

这是一个有效的例子

const { Model, Sequelize } = require('sequelize')

/**
* Models
*/

// initModels it is like array of all your module.exports
const initModels = [
// NOTE: no need to pass models here, only sequelize instance and DataTypes
(sequelize, DataTypes) => {
class User extends Model {}

User.associate = (models) => {
User.belongsToMany(models.Role, { through: models.UserRole, foreignKey: 'role_id' })
}

User.init(
{
username: DataTypes.STRING,
password: DataTypes.STRING,
},
{ sequelize, modelName: 'User', underscored: true }
)

return User
},
(sequelize, DataTypes) => {
class Role extends Model {}

Role.associate = (models) => {
Role.belongsToMany(models.User, { through: models.UserRole, foreignKey: 'user_id' })
}

Role.init(
{
name: DataTypes.STRING,
},
{
sequelize,
modelName: 'Role', // Here is where you have the problem in your example, same for the Role model definition below
underscored: true
}
)

return Role
},
(sequelize, DataTypes) => {
class UserRole extends Model {}

UserRole.init(
{}, // NOTE: you do not need to specify columns here they will be automaticaly created them (unless you are using DB migrations instead of `.sync()`)
{ sequelize, modelName: 'UserRole', timestamps: false, underscored: true }
)

return UserRole
}
];

/**
* Queries
*/

(async () => {
try {
const models = {}
// NOTE: you migth need to change the connection options to run this example
const sequelize = new Sequelize(
'postgres://postgres:root@localhost:5413/sequelize_examples'
)
// init models
initModels.forEach((initFn) => {
const model = initFn(sequelize, Sequelize.DataTypes)
models[model.name] = model
})
Object.keys(models).forEach(modelName => {
if (models[modelName].associate) {
models[modelName].associate(models);
}
});


await sequelize.sync({ force: true })

const adminRole = await models.Role.create({ name: 'Admin' })
const managerRole = await models.Role.create({ name: 'Manager' })
const admin = await models.User.create({ username: 'admin', password: 'secure' })
await admin.setRoles([adminRole, managerRole])
const userRoles = await models.UserRole.findAll()
console.log(userRoles.map(userRole => userRole.toJSON()))

await sequelize.close()
console.log('DONE')
process.exit(0)
} catch (err) {
console.error(err)
process.exit(1)
}
})()
此外,您可以使用此存储库 https://github.com/dmshvetsov/sequelize-examples/blob/main/examples/many-to-many-association/index.js 自己克隆和运行它

关于sequelize.js - 使用 Sequelize 关联模型的方法是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66052888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com