javascript 通过另一个表续写 hasMany
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29165644/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Sequelize hasMany through another table
提问by Marc Rasmussen
Okay so i have the following three models
好的,所以我有以下三个 models
Module:
模块:
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:
权限:
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:
Module_has_competence = sequelize.define('module_has_competence', {
id: DataTypes.INTEGER,
module_id: DataTypes.INTEGER,
competence_id: DataTypes.INTEGER,
score: DataTypes.STRING
},{
freezeTableName: true}
})
As you can see the relation between the tables are an n:m
如您所见,表之间的关系是 n:m
So now i want to find all the Competence
that a Module
has:
所以现在我想找到所有的Competence
一个Module
具有:
So i created the following relationship:
所以我创建了以下关系:
Module.hasMany(Competence, {through: Module_has_competence, foreignKey: 'module_id'});
However when i try to run:
但是,当我尝试运行时:
retrieveById: function (quote_id, onSuccess, onError) {
Module.find({include: [{ all: true }],where: {id: quote_id}})
.success(onSuccess).error(onError);
}
it returns nothing. But if i delete the relationship it returns only the Module
它什么都不返回。但如果我删除关系,它只返回Module
Can anyone tell me what i am doing wrong?
谁能告诉我我做错了什么?
When i debug
当我调试
When i debug it does not log any sql sadly it seems it is just ignoring the sql call ?
当我调试时它没有记录任何 sql 可悲的是它似乎只是忽略了 sql 调用?
采纳答案by Steven Lu
From my understanding, the tables you've created a many to many relationship and that when you query for a "Module", you want all the "Competence" associated to it.
根据我的理解,您创建了多对多关系的表,并且当您查询“模块”时,您需要与其关联的所有“能力”。
Though I wasn't able to get .hasMany()
working, the error produced was:
虽然我无法开始.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)
In which this output is almost impossible to debug.
其中这个输出几乎不可能调试。
However, I was able to create your model bindings and query it correctly with the .belongsToMany()
associations
但是,我能够创建您的模型绑定并使用.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'
})
Which outputs a query that you're 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;
To my understanding .hasMany
references a 1:M relationship, which does not require a join table.
据我了解,.hasMany
引用了 1:M 关系,它不需要连接表。
http://docs.sequelizejs.com/en/latest/docs/associations/#one-to-many-associations
http://docs.sequelizejs.com/en/latest/docs/associations/#one-to-many-associations
Here's the gist of how I got to this conclusion:
这是我如何得出这个结论的要点:
回答by Brandon Seda
Steven's answer did not work for me but switching the foreign keys.
史蒂文的回答对我不起作用,但切换了外键。
Competence.belongsToMany(Module, {
through: Module_has_competence,
as: 'module',
foreignKey: 'competence_id'
});
Module.belongsToMany(Competence, {
through: Module_has_competence,
as: 'competence',
foreignKey: 'module_id'
});