Sequelize.js: get association of many-to-many junction model












0















I have some application. There is an Character, which can belong to many group. A group can have many characters and also many ranks. Each Character have specified rank. Ranks differs across the groups.



Character model:



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;
};


Group model:



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 (junction table) model:



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;
};


Group rank model: (doesn't matter much in my question)



  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;
};


I have added rankId column to junction table and I have problem to retrieve Character with all its groups included and also the rank which it have.
My current code, which returns the Character, the groups to which he belongst to, and also ranks, but the ALL ranks which belongs to the group. And I want just the rank with ID which is specified by rankId.



database.character.findById(characterId, {
include: [{
model: database.group,
through: database.groupmember,
include: {
model: database.grouprank,
/* where: { id: '$GroupMember.rankId$' } */
}
}]
}).then(result => {
});


Yep. I know it looks weird little, it lacks CamelCase but however my problem is about something else. I tried to query with where attribute, but Sequelize is parsing the string, so I can't put there column name. I hope the question is understable enough. Thank you for your time!










share|improve this question





























    0















    I have some application. There is an Character, which can belong to many group. A group can have many characters and also many ranks. Each Character have specified rank. Ranks differs across the groups.



    Character model:



    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;
    };


    Group model:



    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 (junction table) model:



    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;
    };


    Group rank model: (doesn't matter much in my question)



      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;
    };


    I have added rankId column to junction table and I have problem to retrieve Character with all its groups included and also the rank which it have.
    My current code, which returns the Character, the groups to which he belongst to, and also ranks, but the ALL ranks which belongs to the group. And I want just the rank with ID which is specified by rankId.



    database.character.findById(characterId, {
    include: [{
    model: database.group,
    through: database.groupmember,
    include: {
    model: database.grouprank,
    /* where: { id: '$GroupMember.rankId$' } */
    }
    }]
    }).then(result => {
    });


    Yep. I know it looks weird little, it lacks CamelCase but however my problem is about something else. I tried to query with where attribute, but Sequelize is parsing the string, so I can't put there column name. I hope the question is understable enough. Thank you for your time!










    share|improve this question



























      0












      0








      0








      I have some application. There is an Character, which can belong to many group. A group can have many characters and also many ranks. Each Character have specified rank. Ranks differs across the groups.



      Character model:



      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;
      };


      Group model:



      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 (junction table) model:



      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;
      };


      Group rank model: (doesn't matter much in my question)



        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;
      };


      I have added rankId column to junction table and I have problem to retrieve Character with all its groups included and also the rank which it have.
      My current code, which returns the Character, the groups to which he belongst to, and also ranks, but the ALL ranks which belongs to the group. And I want just the rank with ID which is specified by rankId.



      database.character.findById(characterId, {
      include: [{
      model: database.group,
      through: database.groupmember,
      include: {
      model: database.grouprank,
      /* where: { id: '$GroupMember.rankId$' } */
      }
      }]
      }).then(result => {
      });


      Yep. I know it looks weird little, it lacks CamelCase but however my problem is about something else. I tried to query with where attribute, but Sequelize is parsing the string, so I can't put there column name. I hope the question is understable enough. Thank you for your time!










      share|improve this question
















      I have some application. There is an Character, which can belong to many group. A group can have many characters and also many ranks. Each Character have specified rank. Ranks differs across the groups.



      Character model:



      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;
      };


      Group model:



      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 (junction table) model:



      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;
      };


      Group rank model: (doesn't matter much in my question)



        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;
      };


      I have added rankId column to junction table and I have problem to retrieve Character with all its groups included and also the rank which it have.
      My current code, which returns the Character, the groups to which he belongst to, and also ranks, but the ALL ranks which belongs to the group. And I want just the rank with ID which is specified by rankId.



      database.character.findById(characterId, {
      include: [{
      model: database.group,
      through: database.groupmember,
      include: {
      model: database.grouprank,
      /* where: { id: '$GroupMember.rankId$' } */
      }
      }]
      }).then(result => {
      });


      Yep. I know it looks weird little, it lacks CamelCase but however my problem is about something else. I tried to query with where attribute, but Sequelize is parsing the string, so I can't put there column name. I hope the question is understable enough. Thank you for your time!







      javascript orm sequelize.js






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 18 '18 at 17:48







      Jakub

















      asked Nov 18 '18 at 17:31









      JakubJakub

      1624




      1624
























          1 Answer
          1






          active

          oldest

          votes


















          0














          I think below code finally worked for me. 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: Finally I decided to rewrite models as stated here -> FindAll with includes involving a complicated many-to-(many-to-many) relationship (sequelizejs)






          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53363659%2fsequelize-js-get-association-of-many-to-many-junction-model%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            I think below code finally worked for me. 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: Finally I decided to rewrite models as stated here -> FindAll with includes involving a complicated many-to-(many-to-many) relationship (sequelizejs)






            share|improve this answer






























              0














              I think below code finally worked for me. 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: Finally I decided to rewrite models as stated here -> FindAll with includes involving a complicated many-to-(many-to-many) relationship (sequelizejs)






              share|improve this answer




























                0












                0








                0







                I think below code finally worked for me. 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: Finally I decided to rewrite models as stated here -> FindAll with includes involving a complicated many-to-(many-to-many) relationship (sequelizejs)






                share|improve this answer















                I think below code finally worked for me. 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: Finally I decided to rewrite models as stated here -> FindAll with includes involving a complicated many-to-(many-to-many) relationship (sequelizejs)







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Dec 18 '18 at 18:15

























                answered Nov 18 '18 at 21:17









                JakubJakub

                1624




                1624
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53363659%2fsequelize-js-get-association-of-many-to-many-junction-model%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Xamarin.form Move up view when keyboard appear

                    Post-Redirect-Get with Spring WebFlux and Thymeleaf

                    Anylogic : not able to use stopDelay()