3
votes

In my application a user can have several module which is stored in the user_has_module table. This means that for each user_has_module row, I want to include module where the module_id matches.

module

Module = sequelize.define('module', {
    academy_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
    },
    module_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
    },
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    score_to_pass: DataTypes.INTEGER
    }, {
        freezeTableName: true
    })

user_has_module

User_has_module = sequelize.define('user_has_module', {
     user_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
     },
     module_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
     },
     academy_team_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
     },
     academy_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
     },
     sort_number: DataTypes.INTEGER,
     is_complete: DataTypes.INTEGER,
     score_to_pass: DataTypes.INTEGER,
     is_open: DataTypes.INTEGER,
     deadline: DataTypes.DATE
}, {
   freezeTableName: true
})

My relation

User_has_module.belongsTo(Module, {foreignKey: 'module_id'});

Now what I want to do is join them on module.module_id = user_has_module.module_id.

My problem is that module has, as you can see, two primary key, and when sequelize joins these two tables, it chooses academy_id as its primary key.

My question is, is there a way to tell Sequelize that in this relation it has to choose the primary key module_id from module?

1

1 Answers

1
votes

I think you don't need a model called User_has_module. I assume you have one model called User and one model call Module.

So you should have designed something like this:

var User = sequelize.define("User", {
        name: DataTypes.STRING
    }, {
        classMethods: {
            associate: function(models) {
                User.hasMany(models.Module);
            }
        }
    });

And for your Module:

var Module = sequelize.define("Module", {
        name: DataTypes.STRING
    }, {
        classMethods: {
            associate: function(models) {
                Module.belongsToMany(models.User);
            }
        }
    });

To get a User with its Modules you can do this:

models.User.findAll({ include: [models.Module]}).then(function(users){
        console.log(users);
    });

Hope I got your question right and it helps. Cheers