javascript - SequelizeJS - 如何为原始查询映射嵌套(急切加载)模型?
问题描述
下面是一个原始查询的示例。
const query = `SELECT
links.name, links.type, links.code, links.originalUrl,
domains.id as 'domain.id', domains.host as 'domain.host',
count(
CASE WHEN hits.datetime > "${past}" AND hits.datetime <= "${now}" = true then 1 END
) as hitCount
FROM links
LEFT JOIN hits ON links.id = hits.linkId
LEFT JOIN domains ON links.domainId = domains.id
WHERE links.userId = ${req.user.id}
GROUP BY links.id, hits.linkId
ORDER BY hitCount DESC
LIMIT 5`;
const links = await sequelize.query(query.trim(), {
type: sequelize.QueryTypes.SELECT,
model: Link,
mapToModel: true
});
我将查询结果映射到模型Link
中mapToModel: true
。它运行良好,但是当我尝试从连接表中获取一些数据并将其映射到模型中的对象时,它不会转换为数组。
例如,我试图获得这样的域,domains.id as 'domain.id', domains.host as 'domain.host',
这就是我看到 sequlize 对急切加载的数据进行查询的方式。
但是当我得到结果对象时,我没有得到嵌套的域对象属性。
// desired link object
{
id: 3,
name: 'My test link',
domain: {
id: 23,
host: 'example.com'
}
}
相反,我得到的是
// current link object
{
id: 3,
name: 'My test link',
'domain.id': 23,
'domain.host': 'example.com'
}
所以嵌套对象没有正确映射。
更新
我nest
在文档中找到了选项,query()
但设置nest: true
似乎没有任何效果。
更改的查询
const links = await sequelize.query(query.trim(), {
type: sequelize.QueryTypes.SELECT,
model: Link,
mapToModel: true,
nest: true, // doesn't have any effect
});
解决方案
我遇到了同样的问题。我的解决方案是:
return sequelize.query(/* query */, {
nest: true,
type: sequelize.QueryTypes.SELECT
});
如您所见,您不应该设置mapToModel 属性,只需嵌套和键入。
推荐阅读
- java - 更新休眠 org.hibernate.MappingException 后:无法找到具有逻辑名称的列:
- excel - 复杂的excel表查找在下面的行中返回值
- python-3.x - 当文件夹和文件夹内的文件同时创建时获取最新的 AWS S3 文件夹 boto3
- sql - 如何将字段从现在的数据复制到数据
- angular - Angular 6与Chrome设备工具栏点击事件多次触发
- dart - 自定义主题无法正常工作。[扑]
- http - Web 应用程序 IIS 错误 HTTP 500.19
- php - PHP 如何将周划分为天
- java - Java JVM 选择和垃圾回收
- sql-server - 如何在 SQL Server 中运行 3 个月的总行数