You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:42:18