使用 Prisma 通过关联表查询多对多关系

Posted

技术标签:

【中文标题】使用 Prisma 通过关联表查询多对多关系【英文标题】:Querying many-to-many relations via associative table with Prisma 【发布时间】:2021-04-04 04:01:33 【问题描述】:

我是 Prisma 的新手,虽然到目前为止它非常容易上手,但我遇到了一个我似乎无法找到好的答案的问题。我已经阅读了docs about relation queries,但据我了解,Prisma 不支持通过流利的 api 进行多对多。每个查询都必须返回一个实体,然后您可以添加相关表,但在我的情况下,我的查询将返回许多我想加入的实体。

这是我的架构的一个简单示例:

model User 
  id String @id @default(uuid())



model Workspace 
  id String  @id @default(uuid())


model WorkspaceUser 
  workspace   Workspace @relation(fields: [workspaceId], references: [id])
  workspaceId String
  user        User @relation(fields: [userId], references: [id])
  userId      String

我希望做类似的事情:

await prisma.workspaceUser.findMany(
  where:  userId: "123" ,
).workspaces();

另外,我注意到智能感知显示有一个 .join() 方法,但文档中没有提到它。

Prisma 是否提供解决此问题的方法,还是我应该使用 $queryRaw

【问题讨论】:

【参考方案1】:

您可以将确切的语法用于单选,也就是

await prisma.workspaceUser.findUnique(
  where:  userId: "123" ,
).workspace();

对于许多选择,它将作为数组返回,但如果您指定include,则仍应具有相关实体

const allRecords = await prisma.workspaceUser.findMany(
  where:  userId: "123" ,
  include: workspace: true,
);

然后你可以做类似allRecords[i].workspace;

【讨论】:

以上是关于使用 Prisma 通过关联表查询多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

where EXISTS (子查询)多对多中通过中间表查对方列表

Prisma 多对多关系查询

mybatis11--多对多关联查询

NHibernate教程(11)--多对多关联查询

查询显示多对多关系中的关联列表

如何利用 Prisma 的隐式关系来创建以下关系? (一对多,多对多,一对一)