javascript - 有没有办法使用 Sequelize 模型方法来表达以下 SQL 查询?
问题描述
我整个下午都在尝试使用诸如 findOne() 之类的 Sequelize 模型方法来表达以下 SQL 查询 -
SELECT * FROM "Tariffs" WHERE "tariffType" = 'DateRange' AND (('${body.startDate}' BETWEEN "startDate" AND "endDate") OR ('${body.endDate}' BETWEEN "startDate" AND "endDate")) LIMIT 1
wherebody.startDate
和body.endDate
由 HTTP post 提供 -startDate
并且endDate
是 PostgreSQL 后端中保存的日期列。
显然,我可以直接使用执行此操作query()
,但这首先破坏了使用 ORM 的目的。
提供给对象的标准findOne()
似乎没有提供一种明显的方法来提供要匹配的文字值,并且总是需要列名,然后是值。然而,有一种sequelize.where()
方法可以让你在某种程度上解决这个问题,而我能想到的最好的方法就是这个怪物——
Tariffs.findOne({
where: {
[Op.and]: [{
tariffType: "DateRange"
},
{
[Op.or]: [sequelize.where(sequelize.literal(`'${body.startDate}'`), Op.between, sequelize.literal('"startDate" AND "endDate"')),
sequelize.where(sequelize.literal(`'${body.endDate}'`), Op.between, sequelize.literal('"startDate" AND "endDate"'))
]
}
]
}
});
这使得大量使用sequelize.literal
它可能也是不可取的 - 我试图sequelize.col
在where()
调用中定义列名,但该方法似乎不想将它们解释为列名。
谁能建议一个更好的方法来做到这一点,还是我只需要坚持运行原始查询?
编辑 13/05/20
Anatoly 的答案是正确的 - 谢谢。
但是,我最初的逻辑是错误的 - 我实际上想匹配具有提供的开始和结束日期内的开始和结束日期的记录,以及提供的开始日期在其范围内或提供的结束日期在其范围内的记录。因此,在操作员之后需要一个额外的对象[Op.or]
-
[Op.or]: [{
startDate: {
[Op.lte]: body.startDate
},
endDate: {
[Op.gte]: body.startDate
} }, {
startDate: {
[Op.lte]: body.endDate
},
endDate: {
[Op.gte]: body.endDate
} }, {
startDate: {
[Op.gte]: body.startDate
},
endDate: {
[Op.lte]: body.endDate
}
}]
解决方案
你可以尝试这样的事情:
[Op.or]: [{
startDate: {
[Op.lte]: body.startDate
},
endDate: {
[Op.gte]: body.startDate
}
}, {
startDate: {
[Op.lte]: body.endDate
},
endDate: {
[Op.gte]: body.endDate
}
}]
推荐阅读
- php - 我无法在我的 WordPress 帖子中添加媒体(图片)
- c++ - 模板类未特化时为模板类的模板成员函数编写特化的解决方法
- c++ - 如果是来自特定基类的派生类,如何强制转换
- python - 遍历 PyMongo 游标抛出 InvalidBSON: year is out of range
- javascript - html/javascript 如何知道属性是布尔值而不是字符串
- javascript - 未知数量的承诺取决于先前承诺的结果?
- java - android studio java 翻译语言
- python - 模型不学习
- javascript - 使用ajax发送消息
- spring-aop - 方法调用和方法执行——Spring AOP