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

标签 node.js orm sequelize.js

我正在使用 NodeJS 和 sequelize。
我有一个用户表,其中有一列名为 duel_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,
  },
);
上面的代码有效并返回用户和相关的决斗(如果他有的话)。
我还想返回所有关联到同一个决斗的用户。
我试图将关系与 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 定义这种关系以返回与用户决斗相关的所有用户吗?

最佳答案

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

User.belongsTo(Duel, { as: 'duel', foreignKey: 'duel_id' });
如果您希望在决斗模型中拥有用户集合,那么这将适用于以下 hasMany :
Duel.hasMany(User, { as: 'users', foreignKey: 'duel_id' });
考虑到您应该像我在 this answer 中建议的那样在所有模型注册之后注册所有关联
完成所有这些设置后,您可以通过执行这样的查询来获得您想要的:
const user = await User.findOne({
  where: {
     user_id: id
  },
  include: [{
    model: Duel,
    as: 'duel',
    include: [{
      model: User,
      separate: true,
      as: 'users'
    }]
  }]
})

关于node.js - Sequelize.js - 选择正确的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63976891/

相关文章:

node.js - 如何将此目录包含在 $PATH 环境变量中?

java - 使可嵌入类的字段从 JPA 中的嵌入类 transient 化

python - 如何从 SQLAlchemy 中的现有表中获取列名和类型?

mysql - 使用sequelizejs 对第二个表进行 SQL JOIN 条件

typescript - 如何使用 Webpack、TypeScript 和 Sequelize

javascript - Visual Studio Code 正在破坏自关闭标签

javascript - 我将如何过滤从 Slack 返回的数据以找到活跃用户?

PHP Doctrine 2 ORM : Non-Entity object as attribute in entity

node.js - 如何使用 sequelize v6 在 ES6 语法中关联模型

javascript - Node.js - Mocha did() 方法在之前的测试中导致错误