如何在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 应用程序(包含多个文件夹)?
Node.js - 如何使用 graphql 获取关联的模型数据?