knex js - 一对多的关系

时间:2015-12-22 17:14:20

标签: javascript orm

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

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

如何通过q​​uestionId强制knex分组并将所有这些内容放到答案中? 我尝试使用leftjoins但它并不适用于一对多的关系。 这就是我尝试过的:

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

2 个答案:

答案 0 :(得分:1)

我会通过多次查询来解决这个问题。我首先会查询我想要的问题,然后您可以使用具有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()回调中的最后一位可能需要对前一个查询的返回值进行一些额外的操作,以获得您最终想要的数组格式的答案。

答案 1 :(得分:0)

您可以从rdbms创建sql-views,以获得您将拥有的一对多或多对多关系。然后从这些视图中查询。如果您要使用knex重用这些关系,那么它就更容易了。对于插入和更新,在表上使用一个knex事务。