gpt4 book ai didi

javascript - 有没有办法使用 Sequelize 模型方法来表达以下 SQL 查询?

转载 作者:行者123 更新时间:2023-12-03 22:21:19 25 4
gpt4 key购买 nike

我整个下午都在尝试使用诸如 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

其中 body.startDatebody.endDate 由 HTTP post 提供 - startDateendDate 是保存在 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.colwhere() 调用中定义列名,但该方法似乎不想将它们解释为列名。

任何人都可以提出更好的方法来做到这一点,还是我只需要坚持运行原始查询?

编辑 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
}
}]

关于javascript - 有没有办法使用 Sequelize 模型方法来表达以下 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61760787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com