Sequelize.js一对多关系外键

时间:2015-08-13 23:49:30

标签: javascript mysql node.js express sequelize.js

我正在使用Node.js / Express和MySQL与Sequelize.js ORM创建一个调查应用程序。

我无法正确设置2个模型之间的关系。我想提出问题'在答案表中输入外键。

// 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 |
+-----+------------------------+-----+--------------+--------------+------+

我现在已经查看了几个小时的文档,我们非常感谢任何帮助:) 谢谢。

1 个答案:

答案 0 :(得分:1)

你的sql查询应该是;

SELECT * FROM Questions, Answers WHERE Answers.qId = 2 GROUP BY Answers.aId;

SELECT * FROM Questions, Answers WHERE Answers.qId = Questions.qId and Questions.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 |

你应该追加这个联想;

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);
  });