我正在尝试对过滤器端点进行多个查询。假设端点是
router.get('/filter', caseController.getCasesByFilteredRecord);
我希望用户能够在前端进行多个查询。基于 Sequelize 文档,我想出了下面的代码。但是当我测试它时,它使用 AND 来绑定(bind)所有查询,而不是显示所选查询的结果。请参阅下面我的代码:
根据@MOLDA 建议修改
exports.getCasesByFilteredRecord = async (req, res) => {
try {
var where = [];
// iterate over the params
for (let q in req.query) {
var obj = {};
obj[q] = { [Op.eq]: req.query[q] };
// if q is discoveryMethod then the obj is { discoveryMethod: { [Op.eq]: req.query.discoveryMethod } }
where.push(obj);
}
const filteredResult = await Case.findAll({
attributes: { exclude: ['id', 'countryId', 'caseFullname', 'casePhone', 'createdAt', 'caseCommunityName', 'deletedAt'] },
where: {
[Op.or]: [
{
discoveryMethod: {
[Op.eq]: req.query.discoveryMethod
}
},
{
caseAge: {
[Op.eq]: req.query.caseAge
}
},
{
caseGender: {
[Op.eq]: req.query.caseGender
}
},
{
caseComorbidity: {
[Op.eq]: req.query.caseComorbidity
}
},
{
testResult: {
[Op.eq]: req.query.testResult
}
},
{
priority: {
[Op.eq]: req.query.priority
}
},
{
caseStatus: {
[Op.eq]: req.query.caseStatus
}
},
{
requireBedAdmission: {
[Op.eq]: req.query.requireBedAdmidsion
}
},
{
requireICUBed: {
[Op.eq]: req.query.requireICUBed
}
},
{
requireVentilator: {
[Op.eq]: req.query.requireVentilator
}
}
]
},
order: [
['createdAt', 'DESC']
],
limit: 10
});
if (filteredResult.length === 0) {
return res.json({
message: 'There are no case records for this query. Please unselect some items.'
})
};
res.status(200);
res.json({
message: 'Case query records retrieved.',
data: filteredResult
});
} catch (err) {
console.log(err);
res.status(500)
.json({
message: "There is an error retrieving case query records!",
err
});
};
};
假设我的查询类似于
http://localhost:8004/api/v1/cases/filter?caseComorbidity=HBP&testResult=positive&caseGender=Male
Sequelise 将从案例中选择,其中这些查询是输入的值,并为其他人连接所有空值。但我只希望它选择我在查询中输入值的位置并省略空查询。
最佳答案
您应该构建 where
根据您收到的查询参数。
exports.getCasesByFilteredRecord = async (req, res) => {
try {
var where = [];
// iterate over the params
for (let q in req.query) {
var obj = {};
obj[q] = { [Op.eq]: req.query[q] };
// if q is discoveryMethod then the obj is { discoveryMethod: { [Op.eq]: req.query.discoveryMethod } }
where.push(obj);
}
const filteredResult = await Case.findAll({
attributes: { exclude: ['id', 'countryId', 'caseFullname', 'casePhone', 'createdAt', 'caseCommunityName', 'deletedAt'] },
where: {
[Op.or]: where // assign the "where" array here
},
order: [
['createdAt', 'DESC']
],
limit: 10
});
if (filteredResult.length === 0) {
return res.json({
message: 'There are no case records for this query. Please unselect some items.'
})
};
res.status(200);
res.json({
message: 'Case query records retrieved.',
data: filteredResults
});
} catch (err) {
console.log(err);
res.status(500)
.json({
message: "There is an error retrieving case query records!",
err
});
};
};
我没有测试它,所以期待一些错误;)
编辑
exports.getCasesByFilteredRecord = async (req, res) => {
try {
const filteredResult = await Case.findAll({
attributes: { exclude: ['id', 'countryId', 'caseFullname', 'casePhone', 'createdAt', 'caseCommunityName', 'deletedAt'] },
where: req.query, // <-- req.query -> { discoveryMethod: 'blabla' } -> some.url?discoveryMethod=blabla
order: [
['createdAt', 'DESC']
],
limit: 10
});
if (filteredResult.length === 0) {
return res.json({
message: 'There are no case records for this query. Please unselect some items.'
})
};
res.status(200);
res.json({
message: 'Case query records retrieved.',
data: filteredResults
});
} catch (err) {
console.log(err);
res.status(500)
.json({
message: "There is an error retrieving case query records!",
err
});
};
};
关于node.js - 如何在 sequelize 中进行多个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62036643/