Saya menggunakan ORM sekuel; semuanya bagus dan bersih, tetapi saya mengalami masalah saat menggunakannya dengan join
kueri. Saya memiliki dua model: pengguna dan posting.
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);
})
Saya ingin kueri yang merespons dengan kiriman dengan info pengguna yang membuatnya. Dalam kueri mentah, saya mendapatkan ini:
db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
res.json(rows);
});
Pertanyaan saya adalah bagaimana saya dapat mengubah kode untuk menggunakan gaya ORM daripada kueri SQL?
sumber
SELECT * FROM posts JOIN users ON users.id = posts.user_id WHERE users.year_birth = 1984
User.hasMany(Post)
Anda menambahkan metode / atribut ke objek Pengguna, dan ketika Anda memanggilPost.belongsTo(User)
Anda menambahkan metode ke kelas Post. Jika Anda selalu menelepon dari satu arah (mis. User.getPosts ()) maka Anda tidak perlu menambahkan apapun ke objek Post. Tetapi senang memiliki metode di kedua sisi.Meskipun jawaban yang diterima tidak salah secara teknis, itu tidak menjawab pertanyaan asli atau pertanyaan tindak lanjut di komentar, yang saya cari di sini. Tapi saya menemukan jawabannya, jadi ini dia.
Jika Anda ingin menemukan semua Postingan yang memiliki Pengguna (dan hanya yang memiliki pengguna) di mana SQL akan terlihat seperti ini:
Yang secara semantik sama dengan SQL asli OP:
maka inilah yang Anda inginkan:
Pengaturan yang diperlukan menjadi benar adalah kunci untuk menghasilkan gabungan dalam. Jika Anda ingin left outer join (di mana Anda mendapatkan semua Postingan, terlepas dari apakah ada pengguna yang ditautkan), ubah diperlukan menjadi false, atau biarkan karena itu default:
Jika Anda ingin menemukan semua Kiriman milik pengguna yang tahun lahirnya pada tahun 1984, Anda pasti menginginkan:
Perhatikan bahwa required adalah benar secara default segera setelah Anda menambahkan klausa where in.
Jika Anda menginginkan semua Postingan, terlepas dari apakah ada pengguna yang dilampirkan tetapi jika ada pengguna, maka hanya yang lahir pada tahun 1984, lalu tambahkan kembali bidang yang diperlukan:
Jika Anda menginginkan semua Postingan yang namanya "Sunshine" dan hanya jika itu milik pengguna yang lahir pada tahun 1984, Anda akan melakukan ini:
Jika Anda menginginkan semua Postingan yang namanya "Sinar Matahari" dan hanya jika itu milik pengguna yang lahir di tahun yang sama yang cocok dengan atribut post_year pada postingan, Anda akan melakukan ini:
Saya tahu, tidak masuk akal jika seseorang membuat postingan tentang tahun mereka lahir, tapi itu hanya sebuah contoh - ikuti saja. :)
Saya menemukan ini (kebanyakan) dari dokumen ini:
sumber
posts.user_id = users.id
dalam sekuel Anda? terima kasihsumber
Dalam kasus saya, saya melakukan hal berikut. Di UserMaster userId adalah PK dan di UserAccess userId adalah FK dari UserMaster
sumber