簡體   English   中英

序列化:從關聯中獲取MIN / MAX日期

[英]Sequelize: get MIN/MAX Dates from association

我必須表格-一個用於事件,另一個用於日期(開始-結束),此事件是“活動的”。

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()設置事件和EventDates

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',
      },
    ],
  }
]

與group by取得結果並具有許多關聯是非常棘手的,但是最后我找到了方法,這里是:

Event.findAll({
  raw : true,
  attributes : [ 'Event.*' , 'EventDates.eventId' , [sequelize.fn('max', sequelize.col('EventDates.end')),'end']],
  include : {
      model : EventDates ,
      attributes :[]
    },
    group : ['Event.id','EventDates.eventId']
})

我認為您可以通過此方法來實現您的最后一項輸出,我還沒有嘗試過,但這是您可以繼續前進的方法

Event.findAll({
      raw : true,
      attributes : [ 'Event.*' , 'dates.*' , 'EventDates.eventId' , [sequelize.fn('max', sequelize.col('EventDates.end')),'end']],
      include : [
            {
                model : EventDates ,
                attributes :[]
            },
            {
                model : EventDates ,
                as : 'dates',
                required : false,
                separate : true
            }
        ]
        group : ['Event.id','EventDates.eventId']
    })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM