2015-12-22 3 views
1

У меня есть две таблицы - вопросы и ответы, которые связаны внешним ключом на Ответы с именем questionId. Каждый вопрос может содержать несколько ответов. Я пытаюсь создать единый запрос для получения вопросов со всеми полями и поместить ответы в поле массива типов. Например, это структура вопрос:knex js - отношение ко многим отношение

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

Как я могу заставить knex к группе QuestionID и положить их все ответы? Я пытался использовать leftjoins, но он не работает для одного-многих отношений. Это то, что я пробовал:

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

ответ

1

Я хотел бы подойти к этому, выполнив несколько запросов. Я бы сначала запросил вопрос, который я хочу, и вы можете сделать свой первоначальный массив 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() обратного вызова может потребоваться некоторые дополнительные манипуляции возвращаемого значения из предыдущего запроса, чтобы получить ответы в виде массива вы в конечном счете хотите.

+0

Я знаю, что опоздал, но это не масштабируется, если у объектов questionObjects есть много объектов. – Gustavo

Смежные вопросы