繁体   English   中英

knex js-一对多关系

[英]knex js - one to many relation

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

{
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");

我将通过执行多个查询来解决此问题。 我将首先查询所需的问题,然后可以使用具有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()回调中的最后一位可能需要对上一个查询的返回值进行一些其他操作,才能以最终想要的数组格式获取答案。

您可以从rdbms中为您将要拥有的一对多或多对多关系建立sql视图。 然后从这些视图中查询。 如果您要使用knex重用这些关系,则使用该方法更容易。 要进行插入和更新,请在表上使用一个knex事务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM