Sequelize: изменение вложенной структуры данных

Я хочу изменить структуру данных, возвращаемую запросом orm. Всего четыре стола. product,category — это отношения «многие ко многим», есть таблица product_category, которая служит мостом, и всего четыре таблицы, включая таблицу department. ассоциация следующая:

// product
product.belongsToMany(models.category, {
      through: 'product_category',
      foreignKey: 'product_id'
});

// product_category
product_category.belongsTo(models.product, {
      foreignKey: 'product_id'
});
product_category.belongsTo(models.category, {
      foreignKey: 'category_id'
});

// category
category.belongsToMany(models.product, {
      through: 'product_category',
      foreignKey: 'category_id'
});
category.belongsTo(models.department, {
      foreignKey: 'department_id'
});

// department
department.hasMany(models.category, {
      foreignKey: 'department_id'
});

С помощью приведенной выше структуры таблицы получается следующий запрос для получения продуктов, соответствующих department_id:

const query = await product.findOne({
   where: { product_id: id },
   include: {
     model: category,
     attributes: ['category_id', ['name', 'category_name']],
     include: {
       model: department,
       attributes: ['department_id', ['name', 'department_name']]
     }
   },
   attributes: []
});

const data = query.categories;

Полученные данные json выглядят следующим образом:

"data": [
    {
        "category_id": 1,
        "category_name": "French",
        "department": {
            "department_id": 1,
            "department_name": "Regional"
        },
        "product_category": {
            "product_id": 1,
            "category_id": 1
        }
    }
]

Я хочу сделать приведенные выше данные следующим образом:

"data": [
    {
         "category_id": 1,
         "category_name": "French",
         "department_id": 1,
         "department_name": "Regional"
    }
]

Чтобы обработать данные, как указано выше, есть два способа изменить запрос формы на основе sql и обработать значение product в javascript. Однако, так как я изучил sql с помощью orm, я не знал первого метода, поэтому решил использовать его как второй метод.


Первая попытка

Я сделал две попытки. Обратите внимание, что фреймворк использует koa.js. Первый заключается в следующем:

const query = await product.findOne({
  where: { product_id: id },
  include: {
    model: category,
    attributes: ['category_id', ['name', 'category_name']],
    include: {
      model: department,
      attributes: ['department_id', ['name', 'department_name']]
    }
  },
  attributes: []
});

const data = query.categories.map(
      ({ category_id, category_name, department }) => ({
        category_id,
        category_name,
        department_id: department.department_id,
        department_name: department.department_name
      })
    );

ctx.body = data;

Ниже тело:

"data": [
    {
        "category_id": 1,
        "department_id": 1
    }
]

..?? Что-то странно, поэтому немного меняю возвращаемое значение:

({ category_id, category_name, department }) => ({
        // category_id,
        // category_name,
        department_id: department.department_id,
        department_name: department.department_name
      })

Вывод значения json:

"data": [
    {
        "department_id": 1
    }
]

И наоборот, вы аннотировали department_id, department_name:

({ category_id, category_name, department }) => ({
        category_id,
        category_name,
        // department_id: department.department_id,
        // department_name: department.department_name
      })

Результирующее значение json:

"data": [
    {
        "category_id": 1
    }
]

Я не мог поступить иначе.

Вторая попытка

await product
.findOne({
  where: { product_id: id },
  include: {
    model: category,
    attributes: ['category_id', ['name', 'category_name']],
    include: {
      model: department,
      attributes: ['department_id', ['name', 'department_name']]
    }
  },
  attributes: []
})
.then(query => {
  const data = query.categories.map(
    ({ category_id, category_name, department }) => ({
      category_id,
      category_name,
      department_id: department.department_id,
      department_name: department.department_name
    })
  );

  ctx.body = data;
});

Оба метода имеют одинаковые результаты, поэтому я не знаю, что делать.


Поэтому я сопоставляю переменную с вложенным массивом с данными json. Я получаю желаемый результат:

const data = {
  categories: [
    {
      category_id: 1,
      category_name: 'French',
      department: { department_id: 1, department_name: 'Regional' },
      product_category: { product_id: 1, category_id: 1 }
    }
  ]
};

const product = data.categories.map(
  ({ category_id, category_name, department }) => ({
    category_id,
    category_name,
    department_id: department.department_id,
    department_name: department.department_name
  })
);

console.info(product);

// [ { category_id: 1,
//    category_name: 'French',
//    department_id: 1,
//    department_name: 'Regional' } ]

Так что я запутался. Как я могу обработать данные из запроса продолжения? Я был бы очень признателен за вашу помощь.

Пожалуйста, дайте мне знать, если подход к решению проблемы неверен или вам нужна схема модели.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
520
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я реализовал это тривиальным способом. Похоже на полный желудок. Было бы здорово, если бы другой человек вставил в ответ лучший способ.

const getProduct = () => {
  const a = query.categories[0];
  const b = a.get({ plain: true });
  const { category_id, category_name } = b;
  const { department_id, department_name } = b.department;

  return {
    category_id,
    category_name,
    department_id,
    department_name
  };
};

ctx.body = getProduct();

Вывод данных JSON:

"product": {
    "category_id": 1,
    "category_name": "French",
    "department_id": 1,
    "department_name": "Regional"
}

Запрос продолжения будет напечатан как dataValues: {}, (...), если вы запустите console.info (). В этом случае вы не сможете обрабатывать свои данные. Таким образом, КЛЮЧЕВОЙ МОМЕНТ обрабатывает данные после переменной, содержащей запрос, следующим образом:

data.get ({plain: true})

Другие вопросы по теме