如何将查询作为sequelize中的选项?

问题描述 投票:0回答:1

我正在尝试在续集中设置一些控制器。 我希望能够进行不同类型的查询,例如:

api/hotels
api/hotels/id 
api/hotels?featured=true
api/hotels?featured=true&limit=SOMEVALUE
api/hotels?featured=true&limit=SOMEVALUE&somethingsomething

我已经设法让功能和限制都工作,但是如果我没有包含限制,那么其余的都无法正常工作,因为限制将在我的后端服务器中设置为 0 :/

是否可以使其成为各种查询可选? 我可能会补充一点,这是我第一次运行sequelize并创建后端。

我的控制器看起来像这样:

export const getHotels = async (req, res, next) => {
  try {
    const { min, max, limit, ...others } = req.query;
const parsedLimit = limit ? Number(limit) : null;
    const hotels = await Hotel.findAll({
      where: {
        ...others,
        // cheapestPrice: { $gt: min | 1, $lt: max | 100000 },
      },
      limit: Number(parsedLimit),
      [Op.or]: {},
    });
    res.status(200).json(hotels);
  } catch (err) {
    next(err);
  }
};

我可能会补充一点,最小值和最大值应该在最便宜的价格中使用,作为 api 的另一个查询。

提前致谢

mysql reactjs node.js sequelize.js
1个回答
0
投票

您可以根据请求中是否存在相应的参数,有条件地将各种查询包含在 Sequelize 查询中,从而使各种查询成为可选。像这样的东西应该有效,

export const getHotels = async (req, res, next) => {
  try {
    const { min, max, limit, featured, somethingsomething } = req.query;
    const whereClause = {};

    // optional query parameters
    if (min || max) {
      whereClause.cheapestPrice = {
        [Op.gt]: min || 1,
        [Op.lt]: max || 100000,
      };
    }

    if (featured) {
      whereClause.featured = featured;
    }

    // you can add more optional parameters in a similar manner

    const hotels = await Hotel.findAll({
      where: whereClause,
      limit: limit ? Number(limit) : null,
      // include other options as needed
    });

    res.status(200).json(hotels);
  } catch (err) {
    next(err);
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.