所以我试图在我的应用程序上创建一个搜索和过滤功能。在前面,你可以:
- 输入一个搜索栏,通过产品名称搜索产品(在控制器中输入参数“nama”)
- 选择类别以按其类型过滤产品(在控制器中使用参数“type”)
这是我的后台控制器代码
static async show(req, res) {
let { nama, type } = req.params;
if (!nama) {
nama = "";
}
if (!type) {
type = "";
}
try {
let car = await Car.findAll({
order: [["id", "ASC"]],
include: [
{
model: CarsImage,
where: { primary: true },
},
],
where: {
[Op.and]: [
{
nama: {
[Op.iLike]: "%" + nama + "%",
},
},
{
type: {
[Op.iLike]: "%" + type + "%",
},
},
],
}
});
res.status(200).json(car);
} catch (err) {
res.status(500).json(err.message);
}
}
问题如下:
1.仅搜索功能
- 搜索功能可以用,但是如果我输入超过2个字符,它会显示0个结果。当我尝试搜索某些产品时,它也不起作用(我不知道为什么会这样)。
2按类型过滤的搜索功能
- 它可以工作,但是当我在前端清除typeInput状态(以清除过滤器)时(我使用react),它停止正常工作(它不会重置结果,因此结果将为空,除非我清除搜索栏,但之后搜索功能完全停止工作,只有过滤器工作)。
1.仅按类型过滤
- 我的工作没有任何问题,即使在清除typeInput状态之后。
我知道我遇到问题2的原因是因为它仍然用数据库中的类型列过滤那个空字符(在清除typeInput状态之后),但是我想不出更好的逻辑来正确地做到这一点。
任何建议或一个全新的逻辑是赞赏!也让我知道,如果你需要更多的细节。
3条答案
按热度按时间0mkxixxg1#
上面的代码有
[Op.and],
你要实现的是全文搜索,如果name,type和name,type具有相同的字符,则当前代码将返回数据
尝试使用[Op.or],这在搜索许多值时更有意义
xwmevbvl2#
原来我设置的路线是错误的。而在修正之后,在前端添加了一些调整,一切正常
我以前的路线:
纠正路线:
ifsvaxew3#