如何在findMany的where子句中引用关联表的worker.profession字段?
解决方案:在Prisma findMany中实现关联表字段匹配
要实现你需要的shift.profession = worker.profession跨表字段比较逻辑,Prisma的常规查询API无法直接通过对象语法实现,需要借助Raw查询来完成。以下是两种可行的实现方式:
方式1:结合Prisma.raw增强findMany查询
await prisma.shift.findMany({ where: { worker_id: 1, AND: [ { facility: { is_active: true, }, }, // 注意:原查询中worker_id同时设为1和null是冲突的,需根据实际需求调整 { is_deleted: false, }, { worker: { is_active: true, }, }, // 核心逻辑:用Raw SQL片段实现跨表字段相等匹配 Prisma.sql`"profession" = "worker"."profession"` ], }, // 按需关联查询相关表 include: { worker: true, facility: true, }, });
方式2:直接使用Raw SQL查询
如果逻辑更复杂,直接写原生SQL会更清晰:
const targetShifts = await prisma.$queryRaw` SELECT s.* FROM shift s JOIN worker w ON s.worker_id = w.id JOIN facility f ON s.facility_id = f.id WHERE s.worker_id = 1 AND f.is_active = true AND s.is_deleted = false AND w.is_active = true AND s.profession = w.profession `;
关键说明
- 你原代码中的
profession: worker.profession写法无效:这里的worker.profession是未定义的变量(除非你提前查询了worker的profession并赋值,但这是静态值匹配,不是动态跨表比较)。 - 原查询存在逻辑冲突:顶层
worker_id: 1和AND数组里的worker_id: null互斥,必须根据业务需求调整其中一个条件。
内容的提问来源于stack exchange,提问作者PlayMa256
相关产品推荐
相关产品推荐

