Estou usando o sequelize ORM; está tudo ótimo e limpo, mas tive um problema ao utilizá-lo com join
consultas. Tenho dois modelos: usuários e postagens.
var User = db.seq.define('User',{
username: { type: db.Sequelize.STRING},
email: { type: db.Sequelize.STRING},
password: { type: db.Sequelize.STRING},
sex : { type: db.Sequelize.INTEGER},
day_birth: { type: db.Sequelize.INTEGER},
month_birth: { type: db.Sequelize.INTEGER},
year_birth: { type: db.Sequelize.INTEGER}
});
User.sync().success(function(){
console.log("table created")
}).error(function(error){
console.log(err);
})
var Post = db.seq.define("Post",{
body: { type: db.Sequelize.TEXT },
user_id: { type: db.Sequelize.INTEGER},
likes: { type: db.Sequelize.INTEGER, defaultValue: 0 },
});
Post.sync().success(function(){
console.log("table created")
}).error(function(error){
console.log(err);
})
Quero uma consulta que responda com um post com as informações do usuário que fez isso. Na consulta bruta, recebo o seguinte:
db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
res.json(rows);
});
Minha pergunta é como posso alterar o código para usar o estilo ORM em vez da consulta SQL?
fonte
SELECT * FROM posts JOIN users ON users.id = posts.user_id WHERE users.year_birth = 1984
User.hasMany(Post)
adiciona métodos / atributos ao objeto Usuário e quando chamaPost.belongsTo(User)
adiciona métodos à classe Post. Se você está sempre chamando de uma direção (ex. User.getPosts ()), você não precisa adicionar nada ao objeto Post. Mas é bom ter os métodos dos dois lados.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 vim aqui procurar. Mas eu descobri, então aqui vai.
Se você deseja encontrar todas as postagens que têm usuários (e apenas aquelas que têm usuários) onde o SQL seria parecido com este:
O que é semanticamente a mesma coisa que o SQL original do OP:
então é isso que você quer:
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 obrigatório para falso ou deixe-o desativado, pois é o padrão:
Se você deseja encontrar todas as postagens pertencentes a usuários cujo ano de nascimento é em 1984, você deseja:
Observe que obrigatório é verdadeiro por padrão assim que você adiciona uma cláusula where em.
Se você quiser 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 em:
Se você quiser todas as postagens em que o nome é "Sunshine" e apenas se pertencer a um usuário que nasceu em 1984, você faria o seguinte:
Se você quiser todas as postagens cujo nome seja "Sunshine" e apenas se pertencer a um usuário que nasceu no mesmo ano que corresponde ao atributo post_year na postagem, você faria o seguinte:
Eu sei, não faz sentido que alguém faça um post no ano em que nasceu, mas é apenas um exemplo - vá com ele. :)
Eu descobri isso (principalmente) com este documento:
fonte
posts.user_id = users.id
em sua sequência? obrigadofonte
No meu caso, fiz o seguinte. No UserMaster userId é PK e em UserAccess userId é FK de UserMaster
fonte