Агрегирование совместного запроса в массив - PullRequest
1 голос
/ 01 апреля 2020

У меня проблема с попыткой создать запрос, который бы возвращал все, что мне нужно, в одном запросе. Это наша схема БД: https://dbdiagram.io/d/5e4fe6e007a7395d994df445 БД - это heroku postgres, которая по умолчанию версии 12

Учитывая это, мне нужно иметь возможность вернуть объект колоды со всеми пользователь указал c подробности, добавленные к карточкам. Форма возвращаемого объекта должна выглядеть примерно так:

{
  deck_id,
  deck_name,
  deck_author,
  flashcards:[
    {
      flashcard_id,
      question,
      asnwer,
      mastery(needs to be joined from card_mastery table)
    }
  ],
  tags:[
    array of tags
  ]
}

. Прямо сейчас у меня есть следующий запрос, встроенный в knex. js:

db('deck_tags as dt')
    .rightJoin('decks as d', 'd.id', 'dt.deck_id')
    .leftJoin('flashcards as f', 'f.deck_id', 'd.id')
    .leftJoin('tags as t', 't.id', 'dt.tag_id')
    .select(
      'd.id as deck_id',
      'd.user_id',
      'd.name as deck_name',
      'd.public',
      'd.created_at',
      'd.updated_at',
      db.raw(
        'array_to_json(array_remove(ARRAY_AGG( DISTINCT t), NULL)) as tags'
      ),
      db.raw(
        'array_to_json(array_remove(ARRAY_AGG( DISTINCT f), NULL)) as flashcards'
      )
    )
    .groupBy(
      'd.id',
      'd.user_id',
      'd.name',
      'd.public',
      'd.created_at',
      'd.updated_at'
    )
    .where({ 'd.id': id })
    .first();

Кажется, проблема в том, что пользователь получает указанную пользователем информацию. c данные в массив карточек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...