首页 > 解决方案 > 如果没有传递查询字符串,Sequelize 如何获取所有数据

问题描述

我对 Sequelize 很陌生。

我正在尝试创建一个处理程序来获取数据库中的所有播放列表。

这就是我想要做的:

这是我的播放列表模型:

const Playlist = db.define("playlist", {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true,
  },
  name: {
    type: Sequelize.STRING,
    unique: true,
  },
});

这是我的处理程序:

exports.getPlaylists = async (req, res) => {
  try {
    const { name } = req.query;
    console.log(name); // this prints the name
    const result = await Playlist.findAll({
      where: {
        name:
          name === undefined ? {} : { $like: `%${name}%` },
      },
    });
    if (result) {
      res.status(200).send(result);
    } else {
      response.status(404).send("No Playlists found");
    }
  } catch (error) {
    res.status(500).send(`Internal server error: ${error}`);
  }
};

如果我在查询中传递了一个名称,这很有效。但如果我没有传递任何查询字符串。它返回一个空数组。

$like是一个别名Sequelize.Op.like

我应该放什么而不是空对象?

我检查了这个问题How get all data if field in query string is empty Node and Sequelize with Postgres但建议的解决方案不适用于我

标签: node.jsexpresssequelize.js

解决方案


根据条件创建过滤器对象。如果您将空对象传递给 where,它将不会在查询中应用它。

exports.getPlaylists = async (req, res) => {
  try {
    const { name } = req.query;
    const filters = {};
    if (name) 
      filters.name = {
        [Op.like]: `${name}%`, // you can also use $like if you are using older version of sequelize
    }
    const result = await Playlist.findAll({
      where: filters,
    });
    if (result) {
      res.status(200).send(result);
    } else {
      response.status(404).send("No Playlists found");
    }
  } catch (error) {
    res.status(500).send(`Internal server error: ${error}`);
  }
};

这样,您可以根据其他查询字符串准备复杂的过滤器。


推荐阅读