knex js-一对多关系

knex js - one to many relation

本文关键字:关系 一对多 js- knex      更新时间:2023-09-26

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

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

我如何强制knex按问题ID分组,并将所有问题都回答出来?我试着使用leftjoins,但它不适用于一对多关系。这就是我尝试过的:

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

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

您可以从rdbms为您将要拥有的一对多或多对多关系创建sql视图。然后从这些视图进行查询。如果你打算使用knex重用这些关系,那么这样做会更容易。对于插入和更新,请在表上使用一个knex事务。