Knex / SQL: объединить один в несколько объединиться в один объект - PullRequest
0 голосов
/ 14 января 2020

У меня есть две таблицы: «страница» и «страница_ css». Я хочу, чтобы между страницей и страницей была одна-ко-многим (одна страница содержит несколько страниц_ css). См. Структуру таблицы:

Структура таблицы страниц: page table structure

Страница_ css Структура таблицы: page_csss_table_structure

Это запрос Knex, который я использую:

var page = knex('page')
  .where({ slug: req.params.slug })
  .join('page_css', { 'page_css.page_id': 'page.id' })
  .then(function(page) {
    if (page) {
      return res.json(page);
    }
    return res.send('page not found');
  });

Вот результат, который я получаю:

enter image description here

Но я хотите получить результат, подобный следующему:

enter image description here

Какой запрос SQL / Knex мне нужно выполнить, чтобы получить его как в формате выше?

1 Ответ

0 голосов
/ 14 января 2020

Knex не может делать волхвы c, это "просто" построитель запросов, который создает правильный SQL запрос.

Вам нужно будет преобразовать этот плоский результат в объект, подобный вам wi sh .

const flatData = [{
  id: 1,
  slug: 'test',
  page_id: 1,
  css_file: 'main'
}, {
  id: 1,
  slug: 'test',
  page_id: 1,
  css_file: 'hero'
}];

const resultMap = flatData.reduce((result, row) => {
  result[row.id] = result[row.id] || {
    ...row,
    css_file: []
  };

  result[row.id].css_file.push(row.css_file);

  return result;
}, {});

console.log(Object.values(resultMap));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...