如何使用sequelize node.js进行适当的搜索和过滤

hivapdat  于 2023-03-29  发布在  Node.js
关注(0)|答案(3)|浏览(179)

所以我试图在我的应用程序上创建一个搜索和过滤功能。在前面,你可以:

  • 输入一个搜索栏,通过产品名称搜索产品(在控制器中输入参数“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状态之后),但是我想不出更好的逻辑来正确地做到这一点。
任何建议或一个全新的逻辑是赞赏!也让我知道,如果你需要更多的细节。

0mkxixxg

0mkxixxg1#

上面的代码有[Op.and],你要实现的是全文搜索,

`name = ford, type = fcar`
example case1: when you search f ur search will return result because f is in both name and type, simplifying this true  && true  = true
example case2: when you type c it will not because character c is not present in name but present in type, simplifying this false && true  = false

如果name,type和name,type具有相同的字符,则当前代码将返回数据
尝试使用[Op.or],这在搜索许多值时更有意义

xwmevbvl

xwmevbvl2#

原来我设置的路线是错误的。而在修正之后,在前端添加了一些调整,一切正常
我以前的路线:

router.get("/:type?/:nama?", CarController.show);

纠正路线:

router.get("/type/:type?/nama/:nama?", CarController.show);
ifsvaxew

ifsvaxew3#

` let data = await User.findAll({
            order: ["first_name"],
            where: {
                [Op.and]: [{ is_enable: true }],
                [Op.or]: [
                    {
                        first_name: {
                            [Op.like]: "%" + serch + "%",
                        },
                        email: {
                            [Op.like]: "%" + serch + "%",
                        },
                    },
                ],
            },
            include: [
                {
                    model: UserRole,
                    attributes: ["user_role", ["id", "RoleID"]],
                },
            ],
            offset: (page - 1) * limit,
            limit: limit,
        });`

相关问题