2015-12-22 37 views
1

我有兩個表 - 問題和答案是通過名爲questionId的Answers上的外鍵連接的。每個問題可能包含多個答案。我試圖創建一個單一的查詢來獲得所有領域的問題,並將答案放入類型數組的字段中。舉例來說,這是問題的結構:knex js - 一對多關係

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

我怎麼能強迫knex到組由questionId,並把他們全部的答案? 我試圖使用左連接,但它不適用於一對多關係。 這是我已經試過:

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

回答

1

我會做多個查詢接近這個。我會首先查詢我想要的問題,並且可以使用具有名稱和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; 
    }) 

,在。那麼()回調最後一位可能需要返回值的一些額外的操作從以前的查詢來獲取你最終要的陣列格式的答案。

+0

我知道我遲到了,但如果questionObjects有很多對象,這並不會縮放。 – Gustavo