Sequelize.js Sequelize可选where子句参数?

Sequelize.js Sequelize可选where子句参数?,sequelize.js,Sequelize.js,这是一件让我非常恼火的事!我必须为几乎相同的查询编写两个不同的函数 假设我有一个API,它返回与特定的typeId和cityId关联的posts。要获取与类型ID 1或2,或3和城市ID 1相关的所有帖子,我将解析以下内容以进行sequelizefindAll查询: $or: [{typeId: 1}, {typeId: 2}, {typeId: 3}] cityId: 1 但是如果我想得到所有的帖子,其中cityId=1和或typeId=1,2,3,4,5,6,7,8,9,10等… var

这是一件让我非常恼火的事!我必须为几乎相同的查询编写两个不同的函数

假设我有一个API,它返回与特定的
typeId
cityId
关联的
posts
。要获取与
类型ID 1或2,或3和
城市ID 1
相关的
所有
帖子,我将解析以下内容以进行sequelize
findAll
查询:

$or: [{typeId: 1}, {typeId: 2}, {typeId: 3}]
cityId: 1
但是如果我想得到所有的帖子,其中
cityId=1和或typeId=1,2,3,4,5,6,7,8,9,10等…

var types = [{typeId: 1}, {typeId: 2}, {typeId: 3}]
Post.findAll({
     where: {
          if (types != []) $or: types,
          cityId: 1
      }
因此,我必须创建一个新的查询,该查询不包括
$or:types
where子句……因为如果我解析一个空的
types
数组,我会得到一个奇怪的
sql
输出:

WHERE 0 = 1 AND `post`.`cityId` = '1'

注意它是如何输出0=1的?!不知道为什么可以事先构建where对象。这里有一个简单的例子

// Get typeIds from whatever source you have

// Here's an example
var typeIds = [1, 2, 3];

// Or you could try this to build a query without typeIds
// var typeIds = [];

var whereCondition = {};

if (typeIds.length > 0) {
    whereCondition['$or'] = typeIds.map(function(id) {
        return {
            typeId: id
        };
    })
};

whereCondition['cityId'] = 1;

console.log(whereCondition);

Post.findAll(whereCondition).then(function(posts) {
    // The rest of your logic
});

我有一些类似的情况,如果字段未定义,我使用模板文本将空字符串定义为默认值

User.findOne({
where: {
  [Op.or]: [
    { email: `${req.body.email || ""}` },
    { username: `${req.body.username || ""}` },
  ],
},

})

这是一个完美的解决方案。真不敢相信我之前没想到!完美的解决方案是使用一个where属性键,其as值未定义,这不起作用(这是sequelize中的一个bug)