【问题标题】:Sequelize.js One-to-Many relationship foreign keySequelize.js 一对多关系外键
【发布时间】:2015-08-13 23:49:29
【问题描述】:

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

我无法正确设置 2 个模型之间的关系。我想在答案表中有问题的 qId 外键。

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

我已经查看文档几个小时了,如果有任何帮助,我将不胜感激 :) 谢谢。

【问题讨论】:

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


    【解决方案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);
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 2016-10-15
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多