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

