Sequelize可选的where子句参数?

时间:2016-04-07 03:53:09

标签: sequelize.js

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

说我有一个返回posts的API,该API与特定的typeIdcityId相关联。要获得与ALL typeId 1 OR 2, OR 3相关联的cityId 1个帖子,我会将以下内容解析为我的续集findAll查询:

$or: [{typeId: 1}, {typeId: 2}, {typeId: 3}]
cityId: 1

但是我想要发布cityId = 1 andOr typeId = 1,2,3,4,5,6,7,8,9,10,etc...我不能做的所有帖子:

var types = [{typeId: 1}, {typeId: 2}, {typeId: 3}]
Post.findAll({
     where: {
          if (types != []) $or: types,
          cityId: 1
      }

所以我必须创建一个不会包含$or: types where子句的新查询...因为如果我解析一个空的types数组,我会得到一个奇怪的{{1}输出:

sql

注意它输出0 = 1?!不知道为什么

2 个答案:

答案 0 :(得分:7)

您可以预先构建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
});

答案 1 :(得分:0)

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

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

})