Sequelize:从关联中获取MIN / MAX日期

时间:2018-01-29 13:47:49

标签: mysql sequelize.js

我必须使用表 - 一个用于事件,另一个用于日期(开始 - 结束)此事件是“活动的”。

id   name  
--   ----
1    event 1
2    event 2

然后是EventDates

eventId   start         end
-------   -----         ---
1         2018-01-14    2018-01-15
1         2018-01-17    2018-01-18
2         2018-02-14    2018-02-18

使用hasMany()

设置事件和事件日期
Event.DATES = Event.hasMany(models.EventDates, {
  as: 'dates',
  foreignKey: 'eventId',
});

查询包括EventDates在内的所有事件:

await Event.findAll({
  include: [{ association: Event.DATES }]
});

返回包含所有EventDates的嵌套事件列表 - 很棒。

[
  {
    id: 1,
    name: 'event 1',
    dates: [
      {
        start: '2018-01-14',
        end: '2018-01-15',
      },
      {
        start: '2018-01-17',
        end: '2018-01-18',
      },
    ],
  },
  {
    id: 2,
    name: 'event 2',
    dates: [
      {
        start: '2018-02-14',
        end: '2018-02-18',
      },
    ],
  }
]

但是现在我想在事件中添加一个maxEndDate,这样我就可以检查它是否仍处于活动状态,或者是否所有的EventDates都在过去。我可以手动添加另一个LEFT JOIN,如下所示:

# ...
LEFT OUTER JOIN (SELECT eventId, MAX(end) 
                 FROM `EventDates` 
                 GROUP BY eventId) dates 
   ON `Event`.`id` = `dates`.`eventId`
# ...

但是我怎么能用Sequelize达到同样的目的呢?

[
  {
    id: 1,
    name: 'event 1',
    maxEndDate: ??,
    dates: [
      {
        start: '2018-01-14',
        end: '2018-01-15',
      },
      {
        start: '2018-01-17',
        end: '2018-01-18',
      },
    ],
  },
  {
    id: 2,
    name: 'event 2',
    maxEndDate: ??,
    dates: [
      {
        start: '2018-02-14',
        end: '2018-02-18',
      },
    ],
  }
]

1 个答案:

答案 0 :(得分:0)

通过分组获得结果并且有很多关联非常棘手,但最后我找到了方法并且在这里:

iFrame

我认为你可以实现你的最后一次出局,由此,我没有尝试过,但这是你可以继续前进的方式

iFrame