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

如何在Prisma中通过fullname关联两张表实现类MySQL左连接查询?

解决Prisma中基于fullname字段关联查询的问题

方法一:修改模型定义关联(推荐,类型安全)

首先需要在Prisma模型中显式定义基于fullname字段的关联关系,因为Prisma默认通过主键关联,这里要指定非主键字段作为关联依据:

更新后的模型如下:

model User {
  id         Int      @id @default(autoincrement())
  email      String   @unique
  fullname   String
  department String?
  // 定义与UserLibrary的一对多关联,关联名为UserFullname
  userLibraries UserLibrary[] @relation("UserFullname", references: [fullname])
}

model UserLibrary {
  id           Int     @id @default(autoincrement())
  date         String?
  fullname     String?
  // 定义与User的可选关联,通过fullname字段匹配
  user User? @relation("UserFullname", fields: [fullname], references: [fullname])
}

更新模型后,执行npx prisma migrate dev同步数据库Schema。

接下来就可以用Prisma Client执行类型安全的查询,对应你要的SQL逻辑:

const matchedRecords = await prisma.userLibrary.findMany({
  select: {
    date: true,
    fullname: true,
    user: {
      select: {
        department: true
      }
    }
  },
  where: {
    user: {
      department: 'FACULTY_DEPARTMENT'
    }
  }
});

方法二:直接执行原生SQL(快速实现,无类型安全)

如果不想修改模型结构,可以直接使用Prisma的原生查询方法执行你写的MySQL语句:

const matchedRecords = await prisma.$queryRaw`
  SELECT 
    userlibrary.date, 
    userlibrary.fullname, 
    user.department
  FROM 
    userlibrary
  LEFT JOIN
    user
  ON
    userlibrary.fullname = user.fullname
  WHERE user.department = 'FACULTY_DEPARTMENT';
`;

补充说明

你的原始SQL中,LEFT JOIN后加WHERE department = 'FACULTY_DEPARTMENT'会过滤掉所有未匹配到User的UserLibrary记录(因为这些记录的department为null),实际效果和INNER JOIN一致。如果需要保留未匹配的记录,应该把条件移到ON子句中,对应Prisma的话可以调整关联条件,或者用原生SQL修改:

SELECT 
  userlibrary.date, 
  userlibrary.fullname, 
  user.department
FROM 
  userlibrary
LEFT JOIN
  user
ON
  userlibrary.fullname = user.fullname AND user.department = 'FACULTY_DEPARTMENT';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:45:04