[英]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.