如何在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
相关产品推荐
相关产品推荐

