我正在使用 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/