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