Sequelize.js: получить ассоциацию модели соединения многих ко многим - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть приложение. Есть Персонаж, который может принадлежать многим группам. Группа может иметь много персонажей, а также много рангов. Каждый персонаж имеет определенный ранг. Ранги различаются по группам.

Модель персонажа:

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 в таблицу соединений, и у меня возникла проблема с поиском персонажа со всеми включенными в него группами, а также с рангом, который у него есть. Мой текущий код, который возвращает персонажа, группы, к которым он принадлежит, а также ранжирует, но ранжирует ВСЕ, который принадлежит группе. И я хочу только ранг с идентификатором, который указан 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 анализирует строку, поэтому я не могу поместить туда имя столбца. Надеюсь вопрос достаточно нестабильный. Спасибо за ваше время!

1 Ответ

0 голосов
/ 19 ноября 2018

Я думаю, что приведенный ниже код наконец-то сработал для меня. 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`')
      }
    }]
  })

edit: Наконец, я решил переписать модели, как указано здесь -> FindAll с включениями, включающими сложное отношение «многие ко многим (многие ко многим)» (sequelizejs)

...