[英]How do I perform a count on a relation with a where clause in prisma?
[英]Prisma - How to use count as a where condition with relation
我將nestjs
和postgresql
與prisma
一起使用。 我有 2 個相關的表,如果第二個表中的記錄數小於 - 比方說 - 3,我想創建一個 where 子句以獲取記錄。更多細節;
這是我的架構
model User {
id String @id
someOtherFields String
outgoingPlayMateRequest PlayMateRequest[] @relation("userId")
incomingPlayMateRequest PlayMateRequest[] @relation("targetId")
}
model PlayMateRequest {
id Int @id
requestingUser User @relation(name: "userId", fields: [requestingUserId], references: [id], onDelete: Cascade)
targetUser User @relation(name: "targetId", fields: [targetUserId], references: [id], onDelete: Cascade)
requestingUserId String
targetUserId String
someOtherFields String
response String //accept-reject-block
}
這是我的帶有 where 子句的代碼(我通過刪除不相關的部分來簡化它)
const userId = 'testUser';
return await this.prismaService.user.findMany({
where: {
NOT: {
id: userId //don't fetch user him/herself
},
lang: 'EN',
}
});
我想在這里用英文添加的條件是;
不要 select 用戶與incomingPlayMateRequest 關系,如果PlayMateRequest 表中有3 條記錄
response = reject
和requestingUser = userId
但是我無論如何都找不到使用count
作為 where 的條件。 如我所見,我只能獲得關系計數。 我怎么能用prisma
做到這一點?
在 Prisma 中沒有直接的方法來執行這樣的條件,但是您可以使用以下解決方法:
groupBy
查詢。map
創建與過濾條件匹配的所有用戶 id 的User.id
字段數組。findMany
查詢,但在過濾后的用戶 ID 數組中添加一個額外的notIn
條件。這是整個事情的樣子:
const userId = 'testUser';
// step 1
const dataForFilter = await prisma.playMateRequest.groupBy({
by: ['targetUserId'],
where: {
response: "reject",
requestingUserId: userId
},
having: {
targetUserId: {
_count: {
equals: 3
}
}
}
})
// step 2
let exclude_users = [userId]
exclude_users = exclude_users.concat(dataForFilter.map(item => item.targetUserId))
let result = await prisma.playMateRequest.user.findMany({
where: {
id: {
notIn: exclude_users
},
lang: "en"
}
});
我可能誤解了您想要實現的查詢的確切細節,但我認為這應該為您提供一般的查詢結構。 根據需要調整groupBy
查詢以匹配您的確切條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.