Sequelize.js - 选择正确的关系

Sequelize.js - choosing the right relationship

我正在使用 NodeJS 和 sequelize。 我有一个名为 duel_id 的用户 table,并且每个用户一次可以分配给一个决斗。 每个决斗可以有多个用户。

我有以下用户模型:

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,
  },
);

以上代码有效 return 用户和相关的决斗,如果他有的话。

我还想return所有用户关联到同一个决斗。

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

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}]
   }
}

获取当前用户的决斗信息,所有玩家都与同一个 duel_id 关联,作为一个名为 players 的数组。

知道如何使用 sequelize 来定义与 return 与用户决斗关联的所有用户的这种关系吗?

如果 User 模型有 dual_id 那么你应该使用 belongTo 从 User 到 DualRoom 而不是 hasOne:

User.belongsTo(Duel, { as: 'duel', foreignKey: 'duel_id' });

如果您希望在 Duel 模型中收集用户,那么这将适用于以下 hasMany

Duel.hasMany(User, { as: 'users', foreignKey: 'duel_id' });

考虑到您应该像我在

中建议的那样在所有模型注册之后注册所有协会

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

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

因为每个用户都可以进行一场决斗,一场决斗可以关联多个用户。这是一个 one-to-many 协会,因此,您应该尝试:

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