Node.js Sequelize.js-选择正确的关系
我正在使用NodeJS和sequelize。 我有一个名为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)
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'})然后在查询本身中将更改为:“用户”
为更改为:“玩家”