Node.js Sequelize.js-选择正确的关系

Node.js Sequelize.js-选择正确的关系,node.js,orm,sequelize.js,Node.js,Orm,Sequelize.js,我正在使用NodeJS和sequelize。 我有一个名为duel\u id的用户表,每个用户一次可以分配到一个决斗。 每次决斗中都可以有多个用户 我有以下用户模型: const User = Model.define( 'User', { user_id: { type: DataType.INTEGER, primaryKey: true, }, username: { type: DataType.STRING(255)

我正在使用NodeJS和sequelize。 我有一个名为
duel\u id
的用户表,每个用户一次可以分配到一个决斗。 每次决斗中都可以有多个用户

我有以下用户模型:

const User = Model.define(
  'User',
  {
    user_id: {
      type: DataType.INTEGER,
      primaryKey: true,
    },

    username: {
      type: DataType.STRING(255),
    },
    character: {
      type: DataType.INTEGER,
    },
    duel_id: {
      type: DataType.INTEGER,
    },
  },
  {
    indexes: [{ fields: ['user_id', 'username'] }],
    tableName: 'users',
    timestamps: false,
  },
);

User.hasOne(Duel, { as: 'duel', foreignKey: 'id', sourceKey: 'duel_id' });
使用以下决斗模式:

const Duel = Model.define(
  'DuelRoom',
  {
    id: {
      type: DataType.INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    round_id: {
      type: DataType.INTEGER,
    },
    status: {
      type: DataType.STRING,
    },
    turn_of_user_id: {
      type: DataType.INTEGER,
    },
    winner: {
      type: DataType.STRING,
    },
  },
  {
    indexes: [{ fields: ['id'] }],
    tableName: 'duel_rooms',
    timestamps: true,
  },
);
上面的代码工作并返回用户和相关的决斗(如果他有)

我还想返回所有关联到同一决斗的用户

我试图将与
的关系与
的许多
/
联系起来,但没有成功。出现以下错误:

Error: DuelRoom.hasMany called with something that's not a subclass of Sequelize.Model
我希望能够通过查询获得如下数据:

user: { 
   user_id,
   username
   duel: {
      round_number
      players: [{user_id, username}]
   }
}
const user = await User.findOne({
  where: {
     user_id: id
  },
  include: [{
    model: Duel,
    as: 'duel',
    include: [{
      model: User,
      separate: true,
      as: 'users'
    }]
  }]
})
使用决斗信息获取当前用户,所有玩家都与相同的
duel\u id
关联,作为一个名为
players
的数组


知道我如何使用sequelize来定义这样的关系以返回与用户决斗相关联的所有用户吗?

如果用户模型具有
dual\u id
,那么您应该使用
belongTo
从用户到DualRoom,而不是
hasOne

User.belongsTo(Duel, { as: 'duel', foreignKey: 'duel_id' });
如果您希望在决斗模型中收集用户,那么这将适用于以下
hasMany

Duel.hasMany(User, { as: 'users', foreignKey: 'duel_id' });
考虑到你应该在所有模型注册之后注册所有协会,就像我在中建议的那样

完成所有这些设置后,您可以通过执行如下查询来获得所需:

user: { 
   user_id,
   username
   duel: {
      round_number
      players: [{user_id, username}]
   }
}
const user = await User.findOne({
  where: {
     user_id: id
  },
  include: [{
    model: Duel,
    as: 'duel',
    include: [{
      model: User,
      separate: true,
      as: 'users'
    }]
  }]
})

因为每个用户可以有一个决斗,一个决斗可以与多个用户关联。它是一对多关联,因此,您应该尝试:

Duel.hasMany(User);
User.belongsTo(Duel);

谢谢,但是我如何导入
User
Duel
,它会创建一个循环依赖项并返回未定义的,因为关联的模型还没有定义,你知道吗?你看了我的答案和我给你的链接了吗,如果我需要重构所有sequelize代码并添加代码来扫描目录和文件,只是为了使关系在ORM中工作,我宁愿不使用它。谢谢。如果您不想扫描目录,您可以在一个模块中手动注册模型和关联,并显式导入它们。如果您想将认证决斗的用户命名为
players
,则只需重命名别名
duel.hasMany(用户,{as:'players',foreignKey:'duel\u id'})更改为:“用户”
更改为:“玩家”