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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 10:09:09  来源:igfitidea点击:

Sequelize hasMany through another table

javascriptnode.jsormsequelize.js

提问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 Competencethat a Modulehas:

所以现在我想找到所有的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 .hasManyreferences 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:

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

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

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

回答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'
});