javascript - Sequelize.js:获取多对多连接模型的关联
问题描述
我有一些申请。有一个字符,它可以属于许多组。一个组可以有很多角色,也可以有很多等级。每个角色都有指定的等级。各组的排名不同。
人物模型:
module.exports = (sequelize, DataTypes) => {
let Character = sequelize.define('Character', {
/* attributes */
}, {});
Character.associate = (models) => {
Character.hasMany(models.outfit, { foreignKey: 'owner' });
Character.belongsToMany(models.group, { through: models.groupmember });
};
return Character;
};
团体型号:
module.exports = (sequelize, DataTypes) => {
let Group = sequelize.define('Group', {
/* attributes */
}, {});
Group.associate = function (models) {
Group.belongsToMany(models.character, { through: models.groupmember, as: 'members' });
Group.hasMany(models.grouprank);
};
return Group;
};
GroupMember(联结表)模型:
module.exports = (sequelize, DataTypes) => {
let GroupMember = sequelize.define('GroupMember', {
/* groupId, characterId are generated by sequelize */
rankId: DataTypes.INTEGER
}, {});
GroupMember.associate = function (models) {
GroupMember.belongsTo(models.grouprank, { foreignKey: 'rankId', targetKey: 'id' });
};
return GroupMember;
};
组排名模型:(在我的问题中并不重要)
module.exports = (sequelize, DataTypes) => {
let GroupRank = sequelize.define('GroupRank', {
// atributes
}, {});
GroupRank.associate = function (models) {
GroupRank.belongsTo(models.group);
GroupRank.hasMany(models.groupmember, { foreignKey: 'rankId' });
};
return GroupRank;
};
我已将rankId
列添加到联结表中,但我无法检索包含所有组的字符以及它所具有的等级。我当前的代码,它返回角色,他所属的组,以及排名,但属于该组的所有排名。我只想要 ID 指定的排名rankId
。
database.character.findById(characterId, {
include: [{
model: database.group,
through: database.groupmember,
include: {
model: database.grouprank,
/* where: { id: '$GroupMember.rankId$' } */
}
}]
}).then(result => {
});
是的。我知道它看起来有点奇怪,它缺少 CamelCase,但我的问题是关于别的东西。我试图用where
属性查询,但 Sequelize 正在解析字符串,所以我不能在那里放列名。我希望这个问题不够稳定。感谢您的时间!
解决方案
我认为下面的代码终于对我有用。http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html#static-method-literal
database.character.findById(characterId, {
include: [{
model: database.group,
through: database.groupmember,
include: {
model: database.grouprank,
where: database.Sequelize.literal('`Groups->GroupRanks`.`id` = `Groups->GroupMember`.`rankId`')
}
}]
})
编辑:最后我决定重写模型,如此处所述-> FindAll 包含涉及复杂的多对(多对多)关系(sequelizejs)
推荐阅读
- amazon-web-services - 在 AWS S3 中托管的静态网站的高可用性部署
- dc.js - 使用 dc.js 将百分比堆叠到总数中
- javascript - 如何将图像作为滑块句柄(CSS)
- vue.js - 从 Vuejs 上的多个 axios 请求构建嵌套数组
- django - 镜像/继承一个模块,用于输出原始的一些字段
- javascript - 如何访问 div 元素内部?
- css - 媒体维基
最小宽度参数 - python - 一对骰子和一本字典
- javascript - 如何阅读 WebRTC 带宽统计/指标
- reactjs - 如何在 React js 中将 Json 数据与上传的文件一起发送