sequelize:如果包含模型的条件匹配,则不包含模型

时间:2019-02-13 15:07:15

标签: node.js sequelize.js

我想获取今天没有排除日期的所有RecurringEvents。

我有以下型号:

重复发生的事件

const RecurringEvent = sequelize.definge('recurringEvent,{
       id: {type: Sequelize.INTEGER, primaryKey:true},
       title: Sequelize.STRING
       });

和带有外键recurringEventId的ExcludeDates

const ExcludeDate = sequelize.define('exclude_date',{
  id: {type: Sequelize.INTEGER, primaryKey:true},
  recurringEventId: Sequelize.INTEGER,
  date: Sequelize.DATE
});

我定义的关系

RecurringEvent.hasMany(ExcludeDate, {foreignKey: 'recurringEventId'});

我可以获得所有的RecurringEvent,包括带有

的excludeDates

RecurringEvent.findAll({include:[{model:ExcludeDate}]});

这将给我类似以下的输出

[
 {
 "id": 1,
 "title": "Event1",
 "exclude_dates": [
  {
    "id": 1,
    "date": "2019-02-13",
    "recurringEventId": 1,
  },
 {
    "id": 2,
    "date": "2019-02-14",
    "recurringEventId": 1,
  }
]

现在,我希望获得“重复发生”事件,但前提是今天没有排除日期。

到目前为止,我已经尝试过

RecurringEvent.findAll({
    include: [{
        model: ExcludeDate,
        where: {
            date: {
                [Op.ne]: moment().format('YYYY-MM-DD')
            }
        }
    }]
})

但是,这样只会保留带有当前日期的ExcludeDate条目:

[
 {
 "id": 1,
 "title": "Event1",
 "exclude_dates": [
 {
"id": 2,
"date": "2019-02-14",
"recurringEventId": 1,
 }
]

如果今天为它设置了ExcludeDate,如何排除整个RecurringEvent?

修改:

我也阅读了文档

  

要将包含的模型中的where条件从ON条件移动到顶层WHERE,可以使用'$ nested.column $'

所以我已经尝试过了:

RecurringEvent.findAll({where:{
'$exclude_dates.date$':{
[Op.ne]: moment().format('YYYY-MM-DD')
}
},
include: [{model: ExcludeDate}]
})

但是没有运气,我仍然在RecuringEvents中,而在exclude_dates属性中没有一个排除日期

1 个答案:

答案 0 :(得分:0)

尝试将required: true,添加到您的包含模型中以进行内部联接,而不是左联接。例如

RecurringEvent.findAll({
    include: [{
        model: ExcludeDate,
        required: true,
        where: {
            date: {
                [Op.ne]: moment().format('YYYY-MM-DD')
            }
        }
    }]
})