具有包含和约束的NodeJS Sequelize和FindAll

时间:2013-09-27 12:00:37

标签: node.js sequelize.js

我正在尝试使用Find all to Eager中的Include功能在单个查询中加载我需要的数据。我的问题是所有包含都是LEFT OUTER JOIN ...这很好,但我没有看到一种方法来为LEFT OUTER JOIN添加额外的约束。

我的查询看起来像:

Matches.findAll(
   {where: ["match.isPublished = ?", true], 
    include: [RoundMaps, 
              Locations, 
              {model: MemberMaps, as: "MemberMaps", where: ["memberMaps.memberUUID = ?", authenticatedUser.uuid]}]})

但这似乎并不支持......至少我编写语法的方式。我无法将该约束添加到LEFT OUTER JOIN上的约束...向WHERE子句添加相同的约束不起作用...因为这只给了我与成员关联的匹配。我想要所有公共匹配的列表,并知道该成员已经建立了关联的那些。

可以吗? Sequelize似乎已经完成了大部分工作!但仍然在努力解决一些问题。

欢迎见解!

干杯

2 个答案:

答案 0 :(得分:1)

根据您的问题,使用带有LEFT OUTER JOIN的where子句是不可能的。 为此,您必须将SQL查询写入所有公共匹配的列表,并知道该成员已经建立了关联的那些。

sequelize.query('SELECT * FROM "Matches" LEFT OUTER JOIN "RoundMaps" ON "Matches".id = "RoundMaps".match_id LEFT OUTER JOIN "Locations" ON "Matches".id = "Locations".match_id    LEFT OUTER JOIN (SELECT * FROM "MemberMaps" WHERE "MemberMaps".memberUUID = ?) AS "MemberMaps" ON "Matches".id = "MemberMaps".match_id WHERE "Matches".isPublished = ?', null, { raw: true }, [memberUUID,true ]).success(function(myTableRows) {
console.log(myTableRows);
res.send(myTableRows);
});

Executing raw SQL queries in Sequelize

答案 1 :(得分:1)

INCLUDE上有一个选项,用于指定连接是内部还是外部:include.require = boolean

如果未指定where:子句,则默认为false。但是,当设置true时,它会设置为where:

您可以明确地将其关闭以获取findAll()的所有结果。

不幸的是,我见过的唯一例子是代码库本身,但它是: sequelize /测试/集成/协会/所属到many.test.js#L167