Javascript 将findAll与belongtomany关联进行续集
我有两个以这种方式相关的表: 联盟Javascript 将findAll与belongtomany关联进行续集,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,我有两个以这种方式相关的表: 联盟 sequelize.define('league', { name: { type: DataTypes.STRING, }, ownerId: { type: DataTypes.INTEGER, } }, { classMethods: { associate: function(models) { League.belongsToMany(models.user, { const
sequelize.define('league', {
name: {
type: DataTypes.STRING,
},
ownerId: {
type: DataTypes.INTEGER,
}
}, {
classMethods: {
associate: function(models) {
League.belongsToMany(models.user, {
constraints: false,
through: models.UserLeague,
});
}
}
}, {
freezeTableName: true
});
用户
sequelize.define('user', {
name: {
type: DataTypes.STRING
},
email: {
type: DataTypes.STRING,
unique: true,
validate: {
isEmail: true
}
},
profile_picture: {
type: DataTypes.STRING
}
}, {
classMethods: {
associate: function(models) {
User.belongsToMany(models.league, {
constraints: false,
through: models.UserLeague,
});
}
}
}, {
freezeTableName: true
});
我想获取所有包含某个用户的联盟:我现在正在这样做,但是我得到了错误列league.users.id不存在
sequelize.transaction(function (t) {
return models.user.findOne({where: {email: req.query.email}}, {transaction: t}).then(function(user) {
return models.league.findAll({where: {'users.id': user.id}, include: [{model: models.user, as: 'users'}]}).then(function(leagues) {
res.json(leagues);
});
});
});
我如何检索存在某个用户的联盟?您应该将您的
where
添加到包含的模型中:
sequelize.transaction(function (t) {
return models.user.findOne({where: {email: req.query.email}}, {transaction: t}).then(function (user) {
return models.league.findAll({
include: [{
model: models.user,
as: 'users',
where: {
id: user.id
},
required: true
}]
}).then(function (leagues) {
res.json(leagues);
});
});
});
更新:
这不是很好,但我认为,没有更好的解决方案:
sequelize.transaction(function (t) {
return models.user.findOne({where: {email: req.query.email}}, {transaction: t}).then(function (user) {
var _leagueIds = [];
return models.league.findAll({
include: [{
model: models.user,
as: 'users',
where: {
id: user.id
},
required: true
}]
})
.each(function (league) {
_leagueIds.push(league.id);
})
.then(function () {
return models.league.findAll({
where: {
id: _leagueIds,
},
include: [{
model: models.user,
as: 'users'
}]
});
})
.then(function (leagues) {
res.json(leagues);
});
});
});
您应该将
where
添加到包含的模型中:
sequelize.transaction(function (t) {
return models.user.findOne({where: {email: req.query.email}}, {transaction: t}).then(function (user) {
return models.league.findAll({
include: [{
model: models.user,
as: 'users',
where: {
id: user.id
},
required: true
}]
}).then(function (leagues) {
res.json(leagues);
});
});
});
更新:
这不是很好,但我认为,没有更好的解决方案:
sequelize.transaction(function (t) {
return models.user.findOne({where: {email: req.query.email}}, {transaction: t}).then(function (user) {
var _leagueIds = [];
return models.league.findAll({
include: [{
model: models.user,
as: 'users',
where: {
id: user.id
},
required: true
}]
})
.each(function (league) {
_leagueIds.push(league.id);
})
.then(function () {
return models.league.findAll({
where: {
id: _leagueIds,
},
include: [{
model: models.user,
as: 'users'
}]
});
})
.then(function (leagues) {
res.json(leagues);
});
});
});
好的,这部分是我想要的:)这给了我一个包含我想要的用户的联盟,但是只返回想要的用户的联盟,而不是属于该联盟的所有用户的联盟。你明白我的意思吗?我很确定,你需要两个查询来实现这一点。可能吧,但我不知道如何实现。第一个可以检索联盟,但是如何添加联盟中的所有用户。这就是我所缺少的。我不确定我在做什么需要它,但我想知道怎么做:)我用这个修改了答案。它看起来确实很好。我会尽快尝试,并让你知道,但谢谢!好的,这部分是我想要的:)这给了我一个包含我想要的用户的联盟,但是只返回想要的用户的联盟,而不是属于该联盟的所有用户的联盟。你明白我的意思吗?我很确定,你需要两个查询来实现这一点。可能吧,但我不知道如何实现。第一个可以检索联盟,但是如何添加联盟中的所有用户。这就是我所缺少的。我不确定我在做什么需要它,但我想知道怎么做:)我用这个修改了答案。它看起来确实很好。我会尽快尝试,并让你知道,但谢谢!