如何在node.js中拥有多个关联/条件/包含在findAll上的续集

Posted

技术标签:

【中文标题】如何在node.js中拥有多个关联/条件/包含在findAll上的续集【英文标题】:how to have multiple associations/conditions/includes in node.js sequelize on findAll 【发布时间】:2015-01-06 18:17:10 【问题描述】:

我有一个 mysql 数据库,我正在通过 node.js 中的 sequelize 访问它。

我想加入 3 张桌子。

关系是:

Person n : n Work (associated through PersonWork having foreign key for Person and Work)
Work n : n Book (associated through BookWork having foreign key for Book and Work)

我想让 Person、Work 和 Book 加入。

现在我在节点中嵌套了 2 个查询,但结果似乎很慢。

SQLPersonWork.findAll( where: , include: [SQLWork, SQLPerson] ).success(function (sqlresult) 
    sqlresult.forEach(function ProcessPersonWorkResult(oneresult) 
        var work = oneresult.work;
        var name = oneresult.person.name;
        (function (work, name) 
            SQLBookWork.findAll( where:  "work_id": work.id , include: [SQLBook] ).success(function (sqlbookresult) 
                sqlbookresult.forEach(function ProcessBookResult(onebook) 
                    // process result I want to get
                );
            );
        )(work, name);
    );

可以看到双重嵌套的 findAll()。

有没有办法将其组合成 1 个查询?

【问题讨论】:

【参考方案1】:

我不知道这是否是唯一的答案..

根据NodeJS Sequelize and FindAll with Include and constraints 和node.js sequelize associations, include on condition,如果不直接使用 sql,这似乎是不可能的——尽管这似乎违背了续集的目的。

var qstring = "SELECT * FROM mydb.person p \
    join mydb.personrole pr on p.id = pr.person_id \
    join mydb.work w on w.id = pr.work_id \
    join mydb.bookwork bw on bw.work_id = w.id \
    join mydb.book b on b.id = bw.book_id;";
sequelize.query(qstring).success(function (result) 
    console.log(result.count);
    result.forEach(function ProcessRatingResult(oneresult) 
        console.log(oneresult);
    );
);

它的运行速度也相当快。

【讨论】:

以上是关于如何在node.js中拥有多个关联/条件/包含在findAll上的续集的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js 上将多个 JSON 文件拉入 SWIG?

如何通过 firebase 托管在 firebase 上托管 node.js Web 应用程序(包含多个文件夹)?

Doctrine命令到多个关联和匹配条件

Node.js - 如何使用 graphql 获取关联的模型数据?

如何在使用Devise注册时创建新用户时添加或更新关联的属性?

如何在两个不同的主机中拥有两台服务器(django 和 node.js)并相互通信?