如何用Prisma根据当前时间查询餐厅对应时段的菜单类型
完善后的查询代码
直接给你处理好的Prisma查询逻辑,同时覆盖了allDay全天可用的场景,还支持可选的分钟级精确匹配(比单纯小时判断更准确):
// 先获取当前的小时和分钟,分钟可选但建议加上 const now = new Date(); const timeNow = now.getHours(); const timeNowMinutes = now.getMinutes(); const menuType = await db.menu.findMany({ where: { branchId: branchId, // 关联ShowingHours模型的筛选条件 ShowingHours: { OR: [ // 第一种情况:全天可用的时段 { allDay: true }, // 第二种情况:当前时间处于设定的时段区间内 { AND: [ // 开始时间不晚于当前时间 { OR: [ { fromHour: { lt: timeNow } }, { fromHour: { equals: timeNow }, fromMinute: { lte: timeNowMinutes } } ] }, // 结束时间不早于当前时间 { OR: [ { toHour: { gt: timeNow } }, { toHour: { equals: timeNow }, toMinute: { gt: timeNowMinutes } } ] } ] } ] } }, // 可选:如果只需要菜单类型,加上select减少返回数据 select: { type: true } });
关键逻辑说明
- 全天时段兼容:单独处理
allDay: true的记录,这类菜单全天都可获取 - 精确时间匹配:
- 当当前小时等于开始小时时,必须满足当前分钟≥开始分钟
- 当当前小时等于结束小时时,必须满足当前分钟<结束分钟
- 小时不在首尾时,直接判断小时区间即可
- 嵌套关联查询:通过Prisma的嵌套
where条件,直接关联Menu对应的ShowingHours模型做筛选,不需要额外的关联查询
内容的提问来源于stack exchange,提问作者Qoomit
相关产品推荐
相关产品推荐

