Sequelize hasMany通过另一个表

好的,我有以下三种models

模块:

  var Module = sequelize.define('module', { id: DataTypes.INTEGER, name: DataTypes.STRING, description: DataTypes.STRING, category_id: DataTypes.STRING, module_type_id: DataTypes.STRING, gives_score: DataTypes.INTEGER, duration: DataTypes.STRING, price: DataTypes.STRING }, { freezeTableName: true} ) 

权限:

 Competence = sequelize.define('competence', { id: DataTypes.INTEGER, name: DataTypes.STRING, organization_id: DataTypes.INTEGER, competence_type_id: DataTypes.INTEGER },{freezeTableName:true}) 

Module_has_competence:

  Module_has_competence = sequelize.define('module_has_competence', { id: DataTypes.INTEGER, module_id: DataTypes.INTEGER, competence_id: DataTypes.INTEGER, score: DataTypes.STRING },{ freezeTableName: true} }) 

正如你所看到的,表格之间的关系是一个n:m

所以现在我想find一个Module所有Competence

所以我创build了以下关系:

 Module.hasMany(Competence, {through: Module_has_competence, foreignKey: 'module_id'}); 

但是,当我尝试运行:

  retrieveById: function (quote_id, onSuccess, onError) { Module.find({include: [{ all: true }],where: {id: quote_id}}) .success(onSuccess).error(onError); } 

它什么都不返回。 但是,如果我删除关系,它只返回Module

谁能告诉我我做错了什么?

当我debugging

当我debugging它不会logging任何SQL伤心似乎它只是忽略了SQL调用?

根据我的理解,创build了多对多关系的表格,当您查询“模块”时,您需要关联所有“能力”。

虽然我不能让.hasMany()工作,但是产生的错误是:

 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) 

其中这个输出几乎不可能debugging。

但是,我能够创build您的模型绑定并使用.belongsToMany()关联正确地查询它

 Competence.belongsToMany(Module, { through: Module_has_competence, as: 'module', foreignKey: 'module_id' }) Module.belongsToMany(Competence, { through: Module_has_competence, as: 'competence', foreignKey: 'competence_id' }) 

哪个输出您正在查找的查询

  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; 

据我了解.hasMany引用1:M的关系,不需要连接表。

http://docs.sequelizejs.com/en/latest/docs/associations/#one-to-many-associations

这是我如何得出这个结论的要点:

https://gist.github.com/sjlu/fa5c2e0e267cd692418a