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
- thực hiện
sequelize.sync({ force: true })
để đồng bộ hóa tất cả các mô hình - chạy một số cơ sở dữ liệu
seeds
(cũng có thể được thực hiện thông quasequelize-cli
), - 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 MenteeQuestion
và Mentee
(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());
});