Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Contoh sederhana relasi banyak-ke-banyak menggunakan Sequelize

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

  1. lakukan sequelize.sync({ force: true }) untuk menyinkronkan semua model
  2. jalankan beberapa database seeds (juga dapat dilakukan melalui sequelize-cli ),
  3. 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());
});



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menampilkan Baris Tidak Ada di Tabel Lain di MySQL

  2. Implementasi MySQL dari Algoritma ray-casting?

  3. MySQL:Bandingkan ANTARA waktu

  4. MySql memberikan izin pada semua database yang dimulai dengan <string>

  5. Apakah PDO::beginTransaction() menyebabkan tabel atau baris terkunci hingga PDO::commit()?