如何在Prisma中指定字段并直接获取值的扁平数组而非对象数组
解决Prisma查询中直接获取扁平userId数组的问题
嘿,作为Prisma新手,你的思路完全正确——Prisma确实能帮你优化这个流程,虽然没办法直接在查询语句中返回纯number数组(因为Prisma是基于关系模型返回结构化对象),但我们可以优化查询逻辑,让后续的数据处理更简洁,甚至接近“一步到位”的效果。
第一步:优化查询,只获取需要的字段
首先,你可以在查询时通过select指定只返回userIds中的userId字段,避免获取多余的issueId数据,这样返回的结构会更精简:
const project = await prisma.project.findFirst({ where: { id: req.currentUser.projectId }, include: { users: true, issues: { // 这里要记得保留你需要的issue其他字段,比如id、title等,不然只会返回userIds select: { id: true, title: true, // 示例字段,根据你的实际需求调整 userIds: { select: { userId: true } } } } }, })
这样返回的issue.userIds会是[{ userId: 1 }],比原来的结构更干净,后续处理也更简单。
第二步:更简洁的数据转换
基于优化后的查询结果,你可以用更简洁的方式把对象数组转成扁平number数组,比如用map结合解构:
const formattedProject = { ...project, issues: project.issues.map(issue => ({ ...issue, userIds: issue.userIds.map(({ userId }) => userId) })) }
这个写法比你原来的代码更简洁,而且因为查询时已经过滤了多余字段,性能也会更好一点。
有没有办法完全在查询中实现?
目前Prisma Client还不支持直接返回扁平的primitive数组(比如纯[1,2,3]),因为它的查询设计是围绕关系型数据的对象结构展开的。如果一定要完全在数据库层面处理,你可以考虑用原生SQL查询,比如:
const result = await prisma.$queryRaw` SELECT p.*, ARRAY(SELECT userId FROM IssueUser WHERE issueId = i.id) as userIds FROM Project p JOIN Issue i ON p.id = i.projectId WHERE p.id = ${req.currentUser.projectId} `
不过这种方式需要你熟悉数据库的原生语法,而且返回的结果是纯JSON对象,没有Prisma的类型支持,对于新手来说可能没必要。
总结
对于新手来说,最推荐的还是“优化查询+简洁转换”的组合,既利用了Prisma的类型安全和便捷查询,又能得到你想要的扁平数组格式,代码也足够清晰。
内容的提问来源于stack exchange,提问作者Brady Edgar
相关产品推荐
相关产品推荐

