首页 > 解决方案 > 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 正在解析字符串,所以我不能在那里放列名。我希望这个问题不够稳定。感谢您的时间!

标签: javascriptormsequelize.js

解决方案


我认为下面的代码终于对我有用。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)


推荐阅读