javascript - knex js - 一对多关系

标签 javascript orm

我有两个表 - 问题和答案,它们通过名为 QuestionId 的答案上的外键连接。每个问题可能包含多个答案。我正在尝试创建一个查询来获取所有字段的问题并将答案放入数组类型的字段中。例如,这是问题结构:

{
id: 5
name: "abc",
answers: ["a","b","c"]
}

如何强制 knex 按 QuestionId 分组并将它们全部放入答案? 我尝试使用 leftjoin,但它不适用于一对多关系。 这是我尝试过的:

 var questionQuery = this.knex.select().table(this.questionWithAnswersTb)
            .select("*")
            .leftJoin(this.answersTb, this.questionWithAnswersTb + ".id", this.answersTb + ".questionId");

最佳答案

我会通过执行多个查询来解决这个问题。我首先会查询我想要的问题,然后您可以使用具有 name 和 id 属性的信息创建初始 QuestionObjects 数组。然后你可以迭代地调用类似的东西:

var questionObjects = [{id: 5, name: abc}, {id: 6, name: xyz}]; 
// first query makes something like this array ^^, then..
questionObjects.forEach(function(question, index) {
  this.knex.select('answersTable.answers').from('questionsTable').leftJoin(
  'answersTable',
  'answersTable.questionId', 
  'questionsTable.id').where('answersTable.questionId', question.id})
  .then(function(answers) {
    answers = answers.map(/*make your answers look the way you want...*/)
    questionObjects[index].answers = answers;  
  })

.then() 回调中的最后一位可能需要对上一个查询的返回值进行一些额外的操作,以获得您最终想要的数组格式的答案。

关于javascript - knex js - 一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34421133/

相关文章:

mysql - 我可以自动生成 Squeryl 数据对象来反射(reflect)现有的 MySql 模式吗?

java - 使用 ebean 或 hibernate 将值插入到一对一映射注释中

javascript - 在不同的 DOM 元素中组合/批量更新多个 CSS 以减少回流/重绘?

Javascript 将 getHours 更改为 2 位数

python - Django ORM 和工作单元

sql-server - 为 asp.net MVC 应用程序更好地访问数据的路线图

带有 ManyToMany 字段的 Django ORM 继承

javascript - 如何在 emacs 的 js2 模式下 trim 尾随空格

javascript - 倒计时js,不断重启

javascript - 确定元素是否将通过 CSS3 过渡设置动画