Я хочу изменить структуру данных, возвращаемую запросом 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' } ]
Так что я запутался. Как я могу обработать данные из запроса продолжения? Я был бы очень признателен за вашу помощь.
Пожалуйста, дайте мне знать, если подход к решению проблемы неверен или вам нужна схема модели.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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