Я пытаюсь создать простой пример отношения "многие ко многим" между таблицами, используя Sequelize. Однако это кажется более сложным, чем я ожидал.
Это код, который у меня есть в настоящее время (файл ./db.js
экспортирует экземпляр соединения Sequelize).
const Sequelize = require("sequelize");
const sequelize = require("./db");
var Mentee = sequelize.define('mentee', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: Sequelize.STRING
}
});
var Question = sequelize.define('question', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
text: {
type: Sequelize.STRING
}
});
var MenteeQuestion = sequelize.define('menteequestion', {
// answer: {
// type: Sequelize.STRING
// }
});
// A mentee can answer several questions
Mentee.belongsToMany(Question, { as: "Questions", through: MenteeQuestion });
// And a question can be answered by several mentees
Question.belongsToMany(Mentee, { as: "Mentees", through: MenteeQuestion });
let currentQuestion = null;
Promise.all([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
]).then(() => {
return Mentee.destroy({where: {}})
}).then(() => {
return Question.destroy({ where: {} })
}).then(() => {
return Question.create({
text: "What is 42?"
});
}).then(question => {
currentQuestion = question;
return Mentee.create({
name: "Johnny"
})
}).then(mentee => {
console.log("Adding question");
return mentee.addQuestion(currentQuestion);
}).then(() => {
return MenteeQuestion.findAll({
where: {}
, include: [Mentee]
})
}).then(menteeQuestions => {
return MenteeQuestion.findAll({
where: {
menteeId: 1
}
, include: [Mentee]
})
}).then(menteeQuestion => {
console.log(menteeQuestion.toJSON());
}).catch(e => {
console.error(e);
});
При выполнении этого я получаю:
Невозможно добавить ограничение внешнего ключа
Я думаю, что это из-за типа id
, однако я понятия не имею, почему он появляется и как мы можем его исправить.
Еще одна ошибка, которая появилась, когда предыдущая из них не появится:
Выполнение (по умолчанию): INSERT INTO
menteequestions
(menteeId
,questionId
,createdAt
,updatedAt
) VALUES (2,1, '2017-03-17 06:18:01', ' 2017-03-17 06:18:01 ');Ошибка: попечитель не связан с менталитетом!
И еще одна ошибка, которую я получаю - я думаю, что из-за force:true
в sync
-is:
ТАБЛИЦА DROP IF EXISTS
mentees
;ER_ROW_IS_REFERENCED: невозможно удалить или обновить родительскую строку: ограничение внешнего ключа завершено
Как их решить?
Опять же, мне нужен только минимальный пример операции "много ко многим" (в этом случае просто вставлять и читать), но это, кажется, не в моих силах. С этим боролся два дня.