From my point of view, the tables in which you have created many different relationships, and that when you request a "Module", you want all the "Competence" associated with it to be associated with it.
Although I was unable to get .hasMany() , an error occurred:
Trace: [TypeError: Cannot call method 'replace' of undefined] at null.<anonymous> (/Users/sjlu/Development/29165644/app.js:61:13) at tryCatch1 (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/util.js:45:21) at Promise._callHandler (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/promise.js:571:13) at Promise._settlePromiseFromHandler (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/promise.js:581:18) at Promise._settlePromiseAt (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/promise.js:713:18) at Promise._settlePromiseAt (/Users/sjlu/Development/29165644/node_modules/sequelize/lib/promise.js:76:18) at Promise._settlePromises (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/promise.js:854:14) at Async._consumeFunctionBuffer (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/async.js:85:12) at Async.consumeFunctionBuffer (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/async.js:40:14) at process._tickCallback (node.js:442:13)
In this case, this conclusion is almost impossible to debug.
However, I managed to create bindings to your model and correctly request it using .belongsToMany() associations
Competence.belongsToMany(Module, { through: Module_has_competence, as: 'module', foreignKey: 'module_id' }) Module.belongsToMany(Competence, { through: Module_has_competence, as: 'competence', foreignKey: 'competence_id' })
Displays the query you are looking for
SELECT `module`.`id`, `module`.`name`, `module`.`description`, `module`.`category_id`, `module`.`module_type_id`, `module`.`gives_score`, `module`.`duration`, `module`.`price`, `module`.`createdat`, `module`.`updatedat`, `competence`.`id` AS `competence.id`, `competence`.`name` AS `competence.name`, `competence`.`organization_id` AS `competence.organization_id`, `competence`.`competence_type_id` AS `competence.competence_type_id`, `competence`.`createdat` AS `competence.createdAt`, `competence`.`updatedat` AS `competence.updatedAt`, `competence.module_has_competence`.`id` AS `competence.module_has_competence.id`, `competence.module_has_competence`.`module_id` AS `competence.module_has_competence.module_id`, `competence.module_has_competence`.`competence_id` AS `competence.module_has_competence.competence_id`, `competence.module_has_competence`.`score` AS `competence.module_has_competence.score`, `competence.module_has_competence`.`createdat` AS `competence.module_has_competence.createdAt`, `competence.module_has_competence`.`updatedat` AS `competence.module_has_competence.updatedAt` FROM `module` AS `module` LEFT OUTER JOIN (`module_has_competence` AS `competence.module_has_competence` INNER JOIN `competence` AS `competence` ON `competence`.`id` = `competence.module_has_competence`.`module_id`) ON `module`.`id` = `competence.module_has_competence`.`competence_id` WHERE `module`.`id` = 1;
In my understanding .hasMany refers to a 1: M relationship that does not require a join table.
http://docs.sequelizejs.com/en/latest/docs/associations/#one-to-many-associations
Here is the gist of how I got to this:
https://gist.github.com/sjlu/fa5c2e0e267cd692418a