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

如何在Prisma框架中实现间接关联表的查询连接?

在Prisma中实现跨间接关联表的查询

针对你提到的两种SQL查询方式,在Prisma里可以通过以下方式实现:

方式1:遵循外键关联(通过中间表Company关联)

首先确保你的Prisma Schema已经正确定义了表之间的关联关系:

model Company {
  id           Int           @id @default(autoincrement())
  name         String
  companyUsers CompanyUser[]
  companyCars  CompanyCar[]
}

model CompanyUser {
  id        Int      @id @default(autoincrement())
  companyId Int
  company   Company  @relation(fields: [companyId], references: [id])
}

model CompanyCar {
  id        Int      @id @default(autoincrement())
  companyId Int
  company   Company  @relation(fields: [companyId], references: [id])
}

此时可以通过**嵌套include**实现和方式1 SQL完全对应的查询,自动关联中间表Company:

const companyUsersWithCars = await prisma.companyUser.findMany({
  include: {
    company: {
      include: {
        companyCars: true
      }
    }
  }
});

查询结果会返回每个CompanyUser对应的Company,以及该Company下的所有CompanyCar。

方式2:不通过中间表,直接关联CompanyUser和CompanyCar

这种场景有两种实现方式:

方法A:添加Schema直接关联后用include

如果业务上允许,可以在Schema中给CompanyUser和CompanyCar添加直接的关联(基于companyId字段):

model CompanyUser {
  id           Int           @id @default(autoincrement())
  companyId    Int
  company      Company       @relation(fields: [companyId], references: [id])
  // 新增直接关联到CompanyCar
  companyCars  CompanyCar[]  @relation(fields: [companyId], references: [companyId])
}

model CompanyCar {
  id           Int           @id @default(autoincrement())
  companyId    Int
  company      Company       @relation(fields: [companyId], references: [id])
  // 反向关联
  companyUsers CompanyUser[] @relation(fields: [companyId], references: [companyId])
}

更新Schema并运行prisma generate后,就可以直接通过include获取关联数据:

const companyUsersWithCars = await prisma.companyUser.findMany({
  include: {
    companyCars: true
  }
});

这个查询的底层逻辑和你给出的方式2 SQL完全一致,直接通过companyId关联两个表。

方法B:使用原生SQL查询

如果不想修改Schema,可以直接用Prisma的原生查询方法$queryRaw执行你写的SQL:

const result = await prisma.$queryRaw`
  SELECT * FROM CompanyUser companyuser
  JOIN CompanyCar companycar ON companycar.companyId = companyuser.companyId
`;

这种方式完全复用你已有的SQL逻辑,适合快速实现需求。

内容的提问来源于stack exchange,提问作者Thomas Fox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:39:14