Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como fazer consultas de junção usando o Sequelize no Node.js


Embora a resposta aceita não esteja tecnicamente errada, ela não responde à pergunta original nem à pergunta de acompanhamento nos comentários, que foi o que eu vim aqui procurando. Mas eu descobri, então vamos lá.

Se você quiser encontrar todos os Posts que possuem usuários (e apenas os que possuem usuários) onde o SQL ficaria assim:
SELECT * FROM posts INNER JOIN users ON posts.user_id = users.id

Que é semanticamente a mesma coisa que o SQL original do OP:
SELECT * FROM posts, users WHERE posts.user_id = users.id

então é isso que você quer:
Posts.findAll({
  include: [{
    model: User,
    required: true
   }]
}).then(posts => {
  /* ... */
});

A configuração necessária para true é a chave para produzir uma junção interna. Se você quiser uma junção externa esquerda (onde você obtém todas as postagens, independentemente de haver um usuário vinculado), altere o necessário para falso ou deixe-o desativado, pois esse é o padrão:
Posts.findAll({
  include: [{
    model: User,
//  required: false
   }]
}).then(posts => {
  /* ... */
});

Se você deseja encontrar todas as postagens pertencentes a usuários cujo ano de nascimento é 1984, você deseja:
Posts.findAll({
  include: [{
    model: User,
    where: {year_birth: 1984}
   }]
}).then(posts => {
  /* ... */
});

Observe que required é true por padrão assim que você adiciona uma cláusula where in.

Se você deseja todas as postagens, independentemente de haver um usuário anexado, mas se houver um usuário, apenas os nascidos em 1984, adicione o campo obrigatório novamente:
Posts.findAll({
  include: [{
    model: User,
    where: {year_birth: 1984}
    required: false,
   }]
}).then(posts => {
  /* ... */
});

Se você quiser todos os Posts em que o nome seja "Sunshine" e somente se ele pertencer a um usuário que nasceu em 1984, você faria assim:
Posts.findAll({
  where: {name: "Sunshine"},
  include: [{
    model: User,
    where: {year_birth: 1984}
   }]
}).then(posts => {
  /* ... */
});

Se você quiser todos os Posts em que o nome seja "Sunshine" e somente se ele pertencer a um usuário que nasceu no mesmo ano que corresponde ao atributo post_year no post, você faria assim:
Posts.findAll({
  where: {name: "Sunshine"},
  include: [{
    model: User,
    where: ["year_birth = post_year"]
   }]
}).then(posts => {
  /* ... */
});

Eu sei, não faz sentido alguém fazer um post no ano em que nasceu, mas é apenas um exemplo - vá em frente. :)

Eu descobri isso (principalmente) neste documento: