Sebbene la risposta accettata non sia tecnicamente sbagliata, non risponde alla domanda originale né alla domanda di follow-up nei commenti, che era quello che stavo cercando qui. Ma l'ho capito, quindi ecco qui.
Se vuoi trovare tutti i post che hanno utenti (e solo quelli che hanno utenti) in cui l'SQL sarebbe simile a questo:
SELECT * FROM posts INNER JOIN users ON posts.user_id = users.id
Che è semanticamente la stessa cosa dell'SQL originale dell'OP:
SELECT * FROM posts, users WHERE posts.user_id = users.id
allora questo è quello che vuoi:
Posts.findAll({
include: [{
model: User,
required: true
}]
}).then(posts => {
/* ... */
});
L'impostazione richiesta su true è la chiave per produrre un inner join. Se vuoi un join esterno sinistro (dove ottieni tutti i post, indipendentemente dal fatto che ci sia un utente collegato), cambia obbligatorio in false o lascialo disattivato poiché è l'impostazione predefinita:
Posts.findAll({
include: [{
model: User,
// required: false
}]
}).then(posts => {
/* ... */
});
Se vuoi trovare tutti i post appartenenti a utenti il cui anno di nascita è il 1984, vorresti:
Posts.findAll({
include: [{
model: User,
where: {year_birth: 1984}
}]
}).then(posts => {
/* ... */
});
Nota che required è true per impostazione predefinita non appena aggiungi una clausola where in.
Se vuoi tutti i post, indipendentemente dal fatto che ci sia un utente allegato ma se c'è un utente, solo quelli nati nel 1984, aggiungi nuovamente il campo richiesto in:
Posts.findAll({
include: [{
model: User,
where: {year_birth: 1984}
required: false,
}]
}).then(posts => {
/* ... */
});
Se vuoi tutti i Post il cui nome è "Sole" e solo se appartiene a un utente nato nel 1984, dovresti farlo:
Posts.findAll({
where: {name: "Sunshine"},
include: [{
model: User,
where: {year_birth: 1984}
}]
}).then(posts => {
/* ... */
});
Se desideri tutti i post in cui il nome è "Sole" e solo se appartiene a un utente nato nello stesso anno che corrisponde all'attributo post_anno sul post, dovresti farlo:
Posts.findAll({
where: {name: "Sunshine"},
include: [{
model: User,
where: ["year_birth = post_year"]
}]
}).then(posts => {
/* ... */
});
Lo so, non ha senso che qualcuno faccia un post l'anno in cui è nato, ma è solo un esempio:seguilo. :)
L'ho capito (principalmente) da questo documento: