Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Ví dụ đơn giản về quan hệ nhiều-nhiều bằng cách sử dụng Sequelize

Di cư

Tôi khuyên bạn nên sử dụng phần tiếp theo di chuyển thay vào đó thực hiện sync() trên mỗi mô hình. Có một mô-đun - sequize.cli cho phép bạn quản lý việc di chuyển và hạt giống một cách dễ dàng. Theo một cách nào đó, nó buộc cấu trúc dự án bằng cách tạo tệp khởi tạo index.js bên trong /models thư mục của dự án. Nó giả định rằng tất cả các định nghĩa mô hình của bạn sẽ nằm trong thư mục này. Tập lệnh này lặp lại qua tất cả các tệp mô hình (mỗi định nghĩa mô hình nằm trong tệp riêng biệt, ví dụ:mentee.js , question.js ) và thực hiện sequelize.import() để gán các mô hình đó cho phiên bản kích thước tiếp theo - điều này cho phép bạn truy cập chúng sau này qua sequelize[modelName] ví dụ. sequelize.question .

Lưu ý: khi tạo tệp di chuyển, hãy nhớ về các trường dấu thời gian - createdAt , updatedAt và cuối cùng, deletedAt .

Đồng bộ hóa

Cá nhân tôi sử dụng sync() chỉ khi tôi chạy các bài kiểm tra - điều này có thể được hiển thị trong ba bước

  1. thực hiện sequelize.sync({ force: true }) để đồng bộ hóa tất cả các mô hình
  2. chạy một số cơ sở dữ liệu seeds (cũng có thể được thực hiện thông qua sequelize-cli ),
  3. chạy thử nghiệm.

Điều này rất thoải mái vì cho phép bạn làm sạch cơ sở dữ liệu trước khi chạy thử nghiệm và, để phân biệt sự phát triển với các thử nghiệm, các thử nghiệm có thể sử dụng cơ sở dữ liệu khác nhau, ví dụ:project_test , để cơ sở dữ liệu phát triển vẫn còn nguyên vẹn.

Nhiều đến nhiều

Bây giờ chúng ta hãy chuyển sang vấn đề của bạn - mối quan hệ m:n giữa hai mô hình. Trước hết, do bạn thực hiện Promise.all() , sync có thể chạy theo thứ tự khác với việc bạn thêm các chức năng trong đó. Để tránh trường hợp này, tôi khuyên bạn nên sử dụng mapSeries tính năng của Bluebird lời hứa, mà Sequelize sử dụng và hiển thị trong sequelize.Promise (đây cũng là nguyên nhân gây ra lỗi cuối cùng của bạn về việc xóa hàng mẹ - bạn cố gắng xóa mentees được tham chiếu từ menteequestion ).

sequelize.Promise.mapSeries([
    Mentee.sync({ force: true })
  , Question.sync({ force: true })
  , MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {

});

Tham số đầu tiên của mapSeries là mảng các lời hứa, tuy nhiên cái thứ hai là một hàm được chạy với kết quả của mỗi lời hứa đã xác định trước đó. Do thực tế là Model.sync() kết quả trong chính Mô hình, chúng tôi có thể thực hiện model.destroy() ở mỗi lần lặp lại.

Sau đó, bạn có thể chèn một số dữ liệu vào cơ sở dữ liệu thông qua create() , giống như trong ví dụ. Bây giờ là lúc để khắc phục Lỗi:mentee không được liên kết với menteequestion! lỗi. Nó xảy ra bởi vì bạn đã liên kết Mentee với Question nhưng không có sự liên kết nào giữa MenteeQuestionMentee (hoặc Question ). Để khắc phục điều đó, sau belongsToMany , bạn có thể thêm

MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });

Bây giờ bạn có thể thêm include: [Mentee, Question] khi truy vấn MenteeQuestion . Bạn cũng sẽ gặp phải một lỗi khác khi thực hiện toJSON() , bởi vì bạn làm findAll trả về mảng các cá thể. Bạn có thể làm 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. Làm cách nào để đặt AUTO_INCREMENT trong Laravel với Eloquent?

  2. Tôi có phải đề phòng việc tiêm SQL nếu tôi sử dụng trình đơn thả xuống không?

  3. Kết nối với MySQL bằng Python

  4. Sử dụng MySql, tôi có thể sắp xếp một cột nhưng có số 0 ở cuối cùng không?

  5. đếm hồ sơ tham gia bảng câu hỏi và câu trả lời