虽然接受的答案在技术上没有错误,但它没有回答原始问题,也没有回答评论中的后续问题,而这正是我来这里寻找的。但我想通了,所以就这样吧。
如果您想查找所有具有用户的帖子(并且仅查找具有用户的帖子),则 SQL 将如下所示:
SELECT * FROM posts INNER JOIN users ON posts.user_id = users.id
这在语义上与 OP 的原始 SQL 相同:
SELECT * FROM posts, users WHERE posts.user_id = users.id
那么这就是你想要的:
Posts.findAll({
include: [{
model: User,
required: true
}]
}).then(posts => {
/* ... */
});
将 required 设置为 true 是生成内连接的关键。如果您想要左外连接(您可以在其中获取所有帖子,无论是否有链接的用户),则将 required 更改为 false,或者将其保留,因为这是默认值:
Posts.findAll({
include: [{
model: User,
// required: false
}]
}).then(posts => {
/* ... */
});
如果您想查找出生年份为 1984 年的用户的所有帖子,您需要:
Posts.findAll({
include: [{
model: User,
where: {year_birth: 1984}
}]
}).then(posts => {
/* ... */
});
请注意,只要添加 where 子句,默认情况下 required 就是 true。
如果您想要所有帖子,无论是否有附加用户,但如果有用户,则只包含 1984 年出生的帖子,然后将必填字段添加回:
Posts.findAll({
include: [{
model: User,
where: {year_birth: 1984}
required: false,
}]
}).then(posts => {
/* ... */
});
如果您想要名称为“Sunshine”的所有帖子,并且仅当它属于 1984 年出生的用户时,您可以这样做:
Posts.findAll({
where: {name: "Sunshine"},
include: [{
model: User,
where: {year_birth: 1984}
}]
}).then(posts => {
/* ... */
});
如果您想要名称为“Sunshine”的所有帖子,并且仅当它属于与帖子上的 post_year 属性匹配的同一年出生的用户时,您可以这样做:
Posts.findAll({
where: {name: "Sunshine"},
include: [{
model: User,
where: ["year_birth = post_year"]
}]
}).then(posts => {
/* ... */
});
我知道,某人在他们出生的那一年发表帖子是没有意义的,但这只是一个例子 - 就这样吧。 :)
我(大部分)从这个文档中发现了这一点:
- http://docs.sequelizejs.com/en/latest/docs/models-usage/#eager-loading