Używam sequelize ORM; wszystko jest świetne i czyste, ale miałem problem, gdy używam go do join
zapytań. Mam dwa modele: użytkowników i postów.
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);
})
Potrzebuję zapytania, które odpowiada postem z informacjami o użytkowniku, który go utworzył. W surowym zapytaniu otrzymuję to:
db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
res.json(rows);
});
Moje pytanie brzmi: jak mogę zmienić kod, aby używał stylu ORM zamiast zapytania SQL?
źródło
SELECT * FROM posts JOIN users ON users.id = posts.user_id WHERE users.year_birth = 1984
User.hasMany(Post)
, dodajesz metody / atrybuty do obiektu User, a kiedy wywołujeszPost.belongsTo(User)
, dodajesz metody do klasy Post. Jeśli zawsze dzwonisz z jednego kierunku (np. User.getPosts ()), nie musisz niczego dodawać do obiektu Post. Ale miło jest mieć metody po obu stronach.Chociaż zaakceptowana odpowiedź nie jest technicznie zła, nie odpowiada na pierwotne pytanie ani na pytanie uzupełniające w komentarzach, czego tutaj szukałem. Ale wymyśliłem to, więc proszę.
Jeśli chcesz znaleźć wszystkie posty, które mają użytkowników (i tylko te, które mają użytkowników), w których SQL wyglądałby tak:
Co jest semantycznie tym samym, co oryginalny SQL OP:
to jest to, czego chcesz:
Ustawienie wymagane do true jest kluczem do utworzenia sprzężenia wewnętrznego. Jeśli chcesz, aby lewe sprzężenie zewnętrzne (gdzie otrzymujesz wszystkie posty, niezależnie od tego, czy jest połączony użytkownik), zmień wymagane na false lub zostaw je wyłączone, ponieważ jest to ustawienie domyślne:
Jeśli chcesz znaleźć wszystkie posty należące do użytkowników, których rok urodzenia przypada na 1984, możesz:
Zauważ, że required jest domyślnie prawdziwe, gdy tylko dodasz klauzulę where w.
Jeśli chcesz mieć wszystkie posty, niezależnie od tego, czy jest dołączony użytkownik, ale jeśli jest użytkownik, to tylko te urodzone w 1984 r., Dodaj wymagane pole z powrotem:
Jeśli chcesz mieć wszystkie posty, które mają na imię „Sunshine” i tylko jeśli należą do użytkownika, który urodził się w 1984 roku, zrób to:
Jeśli chcesz mieć wszystkie posty, których nazwa brzmi „Sunshine” i tylko jeśli należą do użytkownika, który urodził się w tym samym roku, który jest zgodny z atrybutem post_year w poście, wykonaj następujące czynności:
Wiem, to nie ma sensu, żeby ktoś zrobił wpis w roku urodzenia, ale to tylko przykład - idź z nim. :)
Odkryłem to (głównie) z tego dokumentu:
źródło
posts.user_id = users.id
twój sequelize? dziękiźródło
W moim przypadku zrobiłem następującą rzecz. W UserMaster userid jest PK w UserAccess userId jest FK z UserMaster
źródło