Migrasi
Saya sarankan Anda menggunakan sekuel migrasi
alih-alih melakukan sync()
pada masing-masing model. Ada modul - sequelize.cli
yang memungkinkan Anda mengelola migrasi dan seed dengan mudah. Ini, dalam beberapa cara, memaksa struktur proyek dengan membuat file inisialisasi index.js
di dalam /models
direktori proyek. Diasumsikan bahwa semua definisi model Anda akan berada di direktori ini. Skrip ini mengulangi semua file model (setiap definisi model berada dalam file terpisah, mis. mentee.js
, question.js
) dan menjalankan sequelize.import()
untuk menetapkan model tersebut ke instance sekuel - ini memungkinkan Anda mengaksesnya nanti melalui sequelize[modelName]
misalnya sequelize.question
.
Catatan: saat membuat file migrasi ingat tentang bidang stempel waktu - createdAt
, updatedAt
dan, akhirnya, deletedAt
.
Sinkronkan
Secara pribadi saya menggunakan sync()
hanya ketika saya menjalankan tes - ini dapat ditampilkan dalam tiga langkah
- lakukan
sequelize.sync({ force: true })
untuk menyinkronkan semua model - jalankan beberapa database
seeds
(juga dapat dilakukan melaluisequelize-cli
), - jalankan pengujian.
Ini sangat nyaman karena memungkinkan Anda untuk membersihkan database sebelum menjalankan pengujian, dan, untuk membedakan pengembangan dari pengujian, pengujian dapat menggunakan database yang berbeda mis. project_test
, sehingga database pengembangan tetap utuh.
Banyak-ke-banyak
Sekarang mari beralih ke masalah Anda - hubungan m:n antara dua model. Pertama-tama, karena Anda melakukan Promise.all()
, sync
dapat berjalan dalam urutan yang berbeda dari Anda menambahkan fungsi di dalamnya. Untuk menghindari situasi ini, saya sarankan Anda menggunakan mapSeries
fitur Bluebird
janji, yang Sequelize gunakan dan ekspos di bawah sequelize.Promise
(ini juga alasan kesalahan terakhir Anda tentang menghapus baris induk - Anda mencoba menghapus mentees
yang dirujuk dari menteequestion
).
sequelize.Promise.mapSeries([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {
});
Parameter pertama mapSeries
adalah array dari janji, namun yang kedua adalah fungsi yang dijalankan dengan hasil dari setiap janji yang ditentukan sebelumnya. Karena fakta bahwa Model.sync()
hasil dalam Model itu sendiri, kita dapat melakukan model.destroy()
pada setiap iterasi.
Setelah itu Anda dapat memasukkan beberapa data ke database melalui create()
, seperti pada contoh. Sekarang saatnya untuk memperbaiki Kesalahan:mentee tidak terkait dengan menteequestion! kesalahan. Itu terjadi karena Anda telah mengaitkan Mentee
dengan Question
tetapi tidak ada hubungan antara MenteeQuestion
dan Mentee
(atau Question
). Untuk memperbaikinya, setelah belongsToMany
, Anda dapat menambahkan
MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
Sekarang Anda dapat menambahkan include: [Mentee, Question]
saat menanyakan MenteeQuestion
. Anda juga akan menjalankan kesalahan lain saat melakukan toJSON()
, karena Anda melakukan findAll
yang mengembalikan array instance. Anda dapat melakukan forEach()
menteeQuestions.forEach(menteeQuestion => {
console.log(menteeQuestion.toJSON());
});