преобразовать правую часть объединения одной или многих таблиц в массив в knex - PullRequest
0 голосов
/ 21 февраля 2020

Помогите, пожалуйста, у меня есть идеи таблиц, которые выглядят так:

ideas = {
  id,
  title,
  abstract,
  background,
  classification,
  technicalfeild,
  tag,
  user_id,
}

и изображения идей таблиц, которые выглядят так:

idea-images = {
  id,
  idea_id,
  banner,
  image_details
}

они имеют отношение один ко многим. Мне нужно выбрать все идеи, которые имеют теги publi c, найти изображения в таблице идей и изображений и прикрепить изображения в виде массива к идее, поскольку идея может иметь много изображений. вот мой код

return knex('ideas')
  .where('tag', 'published')
  .rightJoin('idea-images', 'ideas.id', '=', 'idea-images.idea_id')
  .orderBy('ideas.created_at', 'desc');

и вот что он вернет

[
  {
    id: 1,
    title: 'blahhh ',
    abstract: ' blahh',
    background: 'blahhh',
    classification: 'consumer product',
    technicalfeild: '',
    description: 'blah....... ',
    summary: '',
    claims: 'blahhhh',
    tag: 'published',
    user_id: 3,
    created_at: 2020-02-21T00:10:43.692Z,
    updated_at: 2020-02-21T00:10:43.692Z,
    idea_id: 2,
    banner: 'Drawing-2',
    image_details: 'blahhh',

  },
  {
    id: 3,
    title: 'blahhh ',
    abstract: ' test',
    background: 'test',
    classification: 'blahhhh',
    technicalfeild: '',
    description: 'test ',
    summary: '',
    claims: 'test',
    tag: 'published',
    user_id: 2,
    created_at: 2020-02-21T00:10:43.692Z,
    updated_at: 2020-02-21T00:10:43.692Z,
    idea_id: 3,
    banner: 'test',
    image_details: 'test',

  },
  {
    id: 4,
    title: 'My new car ',
    abstract: ' test',
    background: 'test',
    classification: 'consumer product',
    technicalfeild: '',
    description: 'test ',
    summary: '',
    claims: 'test',
    tag: 'published',
    user_id: 2,
    created_at: 2020-02-21T00:10:43.692Z,
    updated_at: 2020-02-21T00:10:43.692Z,
    idea_id: 3,
    banner: 'test2',
    image_details: 'test2',

  }
] 

по какой-то причине он создает новую идею, если идея имеет 2 изображения !!! Я действительно понятия не имею, как превратить данные изображения в массив.

1 Ответ

1 голос
/ 23 февраля 2020

Есть 2 возможных решения:

  1. Используя group_concat, подходит, когда каждая идея имеет небольшое количество изображений, запрос выглядит как https://www.db-fiddle.com/f/74qcRt3siGF2sxT4ykqh9t/1

  2. Разделите на 2 запроса, выберите идеи, а затем выберите все изображения по соответствующим идеям

const ideas = await knex('ideas')
  .where('tag', 'published')
  .orderBy('ideas.created_at', 'desc');
const ideaImages = await knex('ideaImages').whereIn('ideaId', ideas.map(idea => idea.id));

mergeData(ideas, ideaImages);
...