我有两个表 - 问题和答案,它们通过名为 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/