node.js - Sequelize "raw = true" 用点更改 json 模型属性名称
问题描述
我有内容模型,它有很多子 ContentImage 项目,像这样;
const content = await db.Content.findOne({
where: {
permalink: req.params.permalink
},
include: [{
model: db.ContentImages
}]
raw: true
});
如您所知raw:true
,将 SequelizeInstance 隐蔽到对象模型。在这一点上我有一些问题。
如果我使用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
}
}
另一个问题,我有多个内容图像,如果我使用上面第一个示例,它只返回第一个内容图像。
解决方案
您正在考虑它有点倒退 - 当您使用raw: true
它时,它不会将它从 JSON 对象转换为模型实例。
如果您考虑 SQL 结果的结构,它们总是平淡无奇。这意味着对于有一个基本记录链接到多个子项的连接(Content -< ContentImages
在这种情况下),SQL 结果将为每个子项重复基本记录的信息。Sequelize 会将其解析为 JSON 对象,这就是您在问题的第一个示例中看到的内容。如果您省略,raw: true
那么它将更进一步并将其解析为您的模型实例。然后,您可以调用Model.toJSON()
以获取已解析对象的 JSON 表示。
鉴于上述情况,如果您要获取大量子项,那么将数据放入两个查询而不是一个查询会更有效,因此您不必将重复数据发送到客户端。
推荐阅读
- python - 在 Python 中为矩阵赋值
- hibernate - Hibernate Jboss Tools 无法生成 hibernate.cfg.xml 文件
- python - pyenv安装的版本在黑屏中打开空闲
- javascript - 语法错误:意外的令牌:在 AJAX 请求上
- java - 如何从片段访问活动中的按钮 ID
- php - 来自 ajax 的数据未传递到 PHP 文件
- android - Android FusedLocationProviderClient 并不总是有效
- selenium - 如何在 Katalon Studio 中制作新的数据库关键字并使用它们
- python - 每当我执行 cursor.execute 语句时,它只返回整数作为输出?
- mysql - 无法访问 docker 上的 wordpress 网站