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

标签 sequelize.js

我用表 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/

相关文章:

javascript - Sequelize - 如何列出/查看现有模型的所有列

node.js - 列出应用的 Sequelize 迁移

node.js - 无法启动 nodemon 环境

javascript - 如何通过 NODE.js javascript 代码中的大写转换来查询 SQL 数据库中的列。

javascript - Sequelize : How to get record with createdat greater than 1 hour

javascript - 使用 Sequelize 添加/删除字段

node.js - 使用不同别名返回的 created_at 和 updated_at 的两列附加副本

node.js - sequelize.fn 不同的值没有给出条件的所有列

node.js - Node Express js 未处理的拒绝错误 [ERR_HTTP_HEADERS_SENT]

sql-server - 难以使用 Sequelize 连接到 docker 容器内的 SQL Server 数据库