#node.js #sequelize.js
#node.js #sequelize.js
Вопрос:
У меня есть модель содержимого, и в ней есть много элементов дополнительного содержимого, например;
const content = await db.Content.findOne({
where: {
permalink: req.params.permalink
},
include: [{
model: db.ContentImages
}]
raw: true
});
Как вы знаете raw:true
, скрытое продолжение зависит от объектной модели. У меня есть некоторые проблемы в этом пункте.
Если я использую raw:true
, модель json показывает мне вот так;
{
"id": 4706,
"name": "Content Title",
"content": "Content detail",
"t_content_images.id": 7633,
"t_content_images.content_id": 4706,
"t_content_images.image": "content-image-1.jpg",
"t_content_images.order_no": 1
}
Из-за expressjs мне нужна такая модель, а не SequelizeInstance;
{
"id": 4706,
"name": "Content Title",
"content": "Content detail",
"t_content_images": {
"id": 7633,
"content_id": 4706,
"image": "content-image-1.jpg",
"order_no": 1
}
}
Другая проблема, у меня есть несколько изображений содержимого, и если я использую, как указано выше, первый образец, он возвращает мне только первое изображение содержимого.
Ответ №1:
Вы думаете об этом немного назад — когда вы используете raw: true
его, он не преобразует его из объекта JSON в экземпляр модели.
Если вы подумаете о том, как структурируются результаты SQL, они всегда возвращаются плоскими. Это означает, что для объединений, в которых у вас есть одна базовая запись, связанная с несколькими дочерними элементами ( Content -< ContentImages
в данном случае), результаты SQL будут повторять информацию для базовой записи для каждого из дочерних элементов. Sequelize преобразует это в объект JSON, который вы видите в первом примере в вашем вопросе. Если вы оставите raw: true
это, он сделает еще один шаг и проанализирует его в экземпляре вашей модели. Затем вы можете вызвать Model.toJSON()
, чтобы получить JSON-представление анализируемого объекта.
Учитывая вышесказанное, если вы извлекаете много дочерних элементов, то может быть более эффективным получить данные в двух запросах вместо одного, чтобы вам не приходилось отправлять повторяющиеся данные клиенту.
Комментарии:
1. «Затем вы можете вызвать Model.toJSON(), чтобы получить представление анализируемого объекта в формате JSON». это решило мою проблему. Он преобразовал SequelizeInstance в объект JSON. Спасибо за ваше время.