Sequelize hasMany浏览另一张表
Sequelize hasMany through another table
好的,所以我有以下三个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 = sequelize.define('module_has_competence', {
id: DataTypes.INTEGER,
module_id: DataTypes.INTEGER,
competence_id: DataTypes.INTEGER,
score: DataTypes.STRING
},{
freezeTableName: true}
})
正如您所看到的,表之间的关系是n:m
所以现在我想找到Module
具有的所有Competence
:
所以我创建了以下关系:
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
有人能告诉我我做错了什么吗?
调试时
当我调试它时,它没有记录任何sql,遗憾的是,它似乎只是忽略了sql调用?
根据我的理解,您创建的表是多对多关系,当您查询"模块"时,您希望所有的"能力"都与之相关。
虽然我无法使.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)
在这种情况下,这种输出几乎不可能调试。
然而,我能够创建您的模型绑定,并使用.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-许多协会
以下是我得出这个结论的要点:
https://gist.github.com/sjlu/fa5c2e0e267cd692418a
Steven的回答对我不起作用,但切换了外键。
Competence.belongsToMany(Module, {
through: Module_has_competence,
as: 'module',
foreignKey: 'competence_id'
});
Module.belongsToMany(Competence, {
through: Module_has_competence,
as: 'competence',
foreignKey: 'module_id'
});
相关文章:
- 有人能提供一张ember数据与broswer's的持久层
- jQuery只隐藏<tr>在一张桌子上
- 如何从三张图片中选择一张?其余的必须是看不见的
- 通过onclick事件将一张图片更改为6张图片
- Sequelize hasMany浏览另一张表
- jm按下停止步骤进入滚动的下一张幻灯片
- 我用JavaScript FIleReader读了一张图片,但是我无法得到图片的信息
- 当 Flickity 到达下一张或上一张幻灯片时的事件
- 单击从一张图像切换到两张图像,然后再切换回一张图像
- 单击另一张图像,显示一张图像几秒钟
- 为什么bxSlider会打断我在最后一张幻灯片和第一张幻灯片之间的转换
- 用d3和topojson绘制一张地图
- 引导程序3转盘-随机选择下一张幻灯片
- 每张图片都比前一张少
- HTML5画布如何在另一张图片上绘制一张图片
- 拍摄一张巨大的网页截图(大小超过1350x13500px)
- 如何在最后一张幻灯片上停止动画
- 完整的背景图片幻灯片jquery,想让幻灯片的最后一张图片可以点击
- jqplot只在一张图表上显示荧光笔
- Javascript-获取一张用户的随机个人资料图片'的朋友在脸书上