在Prisma中如何选择指定字段并获取关联计数?
问题:Prisma中如何仅选择id字段同时获取关联计数?
我用TypeScript搭配Prisma开发,定义了如下EmailAccount模型:
model EmailAccount { id String @id @default(uuid()) email String @unique name String @default("") imapServer String @default("") imapPort Int @default(993) imapSecure Boolean @default(true) smtpServer String @default("") smtpPort Int @default(465) smtpSecure Boolean @default(true) dateCreated DateTime @default(now()) dateUpdated DateTime @default(now()) active Boolean @default(false) passwordEncrypted String @default("") passwordIV String @default("") passwordAuthTag String @default("") passwordKey Int @default(0) keyRotationDate DateTime @default(now()) keyRotationFrequency String @default("") keyNextRotationDate DateTime @default(now()) KeyRotationStatus String @default("NeverRotated") StorePassword Boolean @default(true) MaxToRetrieve Int @default(100) emailRules EmailRule[] // Relation to EmailRule records folders Folder[] // Relation to Folder records RulesProcessedHistory RulesProcessedHistory[] // Relation to RulesProcessedHistory records }
执行以下代码时,能正常返回emailAccount的所有字段及关联数据的计数:
const emailAccounts = await prisma.emailAccount.findMany({ include: { _count: { select: { folders: true, emailRules: true, RulesProcessedHistory: true }, }, }, });
但尝试在include中添加id: true以仅获取id字段时,出现TypeScript错误:TS2353: Object literal may only specify known properties, and id does not exist in type EmailAccountInclude<DefaultArgs>,错误代码如下:
const emailAccounts = await prisma.emailAccount.findMany({ include: { id: true, _count: { select: { folders: true, emailRules: true, RulesProcessedHistory: true }, }, }, });
想请教为何会出现该错误,以及如何实现仅选择id字段同时获取关联计数?
错误原因
include的作用是加载关联模型的完整数据,它只接受模型的关联字段(比如emailRules、folders)或特殊的聚合选项(比如_count),不支持指定模型自身的标量字段(比如id、email)。你把id放在include对象里,不符合Prisma的API规范,因此触发TypeScript类型校验错误。
解决方案
要筛选模型自身的字段,需要使用select选项,同时可以在select中包含_count来获取关联计数。正确代码如下:
const emailAccounts = await prisma.emailAccount.findMany({ select: { id: true, _count: { select: { folders: true, emailRules: true, RulesProcessedHistory: true }, }, }, });
这段代码会返回仅包含id字段和对应关联计数的结果,完全符合需求。
内容的提问来源于stack exchange,提问作者Peter Kellner
相关产品推荐
相关产品推荐

