Javascript Sequelize.js一对多关系外键
我正在使用Node.js/Express和MySQL以及Sequelize.js ORM创建一个调查应用程序 我无法正确设置两个模型之间的关系。我想把问题的qId外键放在答案表中Javascript Sequelize.js一对多关系外键,javascript,mysql,node.js,express,sequelize.js,Javascript,Mysql,Node.js,Express,Sequelize.js,我正在使用Node.js/Express和MySQL以及Sequelize.js ORM创建一个调查应用程序 我无法正确设置两个模型之间的关系。我想把问题的qId外键放在答案表中 // define the Questions table var Questions = sequelize.define('Questions', { qId: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true}, questi
// define the Questions table
var Questions = sequelize.define('Questions', {
qId: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true},
question: Sequelize.STRING
}, {
timestamps: false
});
// define the Answers table
var Answers = sequelize.define('Answers', {
aId: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true},
answer: Sequelize.STRING,
answer_count: { type: Sequelize.INTEGER, defaultValue: 0}
}, {
timestamps: false
});
// define one-to-many relationship
Questions.hasMany(Answers, {as: 'Answers', foreignKey: 'qId'});
Questions.sync({force: true}).then(function() {
// OPTIONAL: create a new question upon instantiating the db using sequelize
Questions.create({question: 'what is your language?'});
Questions.create({question: 'what is your drink?'});
console.log('created Questions table');
}).catch(function(error) {
console.log('error creating Questions table');
});
Answers.sync({force: true}).then(function() {
Answers.create({answer: 'python', qId: 1});
Answers.create({answer: 'javascript', qId: 1});
Answers.create({answer: 'ruby', qId: 1});
Answers.create({answer: 'c++', qId: 1});
Answers.create({answer: 'manhattan', qId: 2});
Answers.create({answer: 'cosmopolitan', qId: 2});
console.log('created Answers table');
}).catch(function(error) {
console.log('error creating Answers table');
});
但当我执行MySQL查询时:
select * from Questions, Answers where Answers.qId=2;
它显示了以下内容:
mysql> select * from Answers;
+-----+--------------+--------------+------+
| aId | answer | answer_count | qId |
+-----+--------------+--------------+------+
| 1 | python | 0 | 1 |
| 2 | javascript | 0 | 1 |
| 3 | ruby | 0 | 1 |
| 4 | c++ | 0 | 1 |
| 5 | manhattan | 0 | 2 |
| 6 | cosmopolitan | 0 | 2 |
+-----+--------------+--------------+------+
6 rows in set (0.00 sec)
mysql> select * from Questions;
+-----+------------------------+
| qId | question |
+-----+------------------------+
| 1 | what is your language? |
| 2 | what is your drink? |
+-----+------------------------+
2 rows in set (0.00 sec)
mysql> select * from Questions, Answers where Answers.qId=2;
+-----+------------------------+-----+--------------+--------------+------+
| qId | question | aId | answer | answer_count | qId |
+-----+------------------------+-----+--------------+--------------+------+
| 1 | what is your language? | 5 | manhattan | 0 | 2 |
| 1 | what is your language? | 6 | cosmopolitan | 0 | 2 |
| 2 | what is your drink? | 5 | manhattan | 0 | 2 |
| 2 | what is your drink? | 6 | cosmopolitan | 0 | 2 |
+-----+------------------------+-----+--------------+--------------+------+
当我想展示的时候
mysql> select * from Questions, Answers where Answers.qId=2;
+-----+------------------------+-----+--------------+--------------+------+
| qId | question | aId | answer | answer_count | qId |
+-----+------------------------+-----+--------------+--------------+------+
| 2 | what is your drink? | 5 | manhattan | 0 | 2 |
| 2 | what is your drink? | 6 | cosmopolitan | 0 | 2 |
+-----+------------------------+-----+--------------+--------------+------+
我已经看了几个小时的文档,非常感谢您的帮助:)
谢谢。您的sql查询应该是:
SELECT * FROM Questions, Answers WHERE Answers.qId = 2 GROUP BY Answers.aId;
或
这个查询将向您显示这一点
| qId | question | aId | answer | answer_count | qId |
|-----|---------------------|-----|---------------|--------------|-----|
| 2 | what is your drink? | 5 | manhattan | 0 | 2 |
| 2 | what is your drink? | 6 | cosmopolitan | 0 | 2 |
您应该附加此关联
Answer.belongsTo(Question, {
"constraints": true,
"foreignKey": 'qId'
});
之后,您应该能够像这样使用此关系/连接
Question
.findOne({
"where": {
"qId": 2
},
"include": [Answer]
})
.then(function(question) {
// should show question with its answers
console.log(question);
// should show just answers of this question
console.log(question.Answers);
});
Question
.findOne({
"where": {
"qId": 2
},
"include": [Answer]
})
.then(function(question) {
// should show question with its answers
console.log(question);
// should show just answers of this question
console.log(question.Answers);
});