Prisma – Cómo utilizar “count” como una condición “where” con una relación
Utilizo nestjs
y postgresql
con prisma
. Tengo 2 tablas en relación, quiero crear una cláusula where para obtener los registros si el conteo de los registros en la segunda tabla es menor a -digamos- 3. Más detalles:
Aquí está mi esquema:
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
}
Y aquí está mi código con la cláusula where (simplificándolo al eliminar partes no relevantes):
const userId = 'testUser';
return await this.prismaService.user.findMany({
where: {
NOT: {
id: userId // no seleccionar al usuario/a mismo/a
},
lang: 'EN',
}
});
La condición que quiero añadir aquí en español es:
No seleccionar usuarios con una relación incomingPlayMateRequest si hay más de 3 registros en la tabla PlayMateRequest con
response = reject
YrequestingUser = userId
.
Pero no pude encontrar una forma de usar count
como condición en el where. Por lo que veo, solo puedo obtener el conteo de las relaciones. ¿Cómo puedo hacer esto con prisma
?
davy.ai
Puedes utilizar una consulta
count
anidada y una subconsulta para lograr esta condición enprisma
. Aquí te mostramos cómo puedes modificar tu código para incluir esta condición:En el código anterior, utilizamos
none
para excluir a los usuarios que cumplen con la condición especificada en el arrayAND
. El arrayAND
incluye tres condiciones:response: 'reject'
,requestingUserId: userId
ycount: { response: 'reject' }
. Esta última condición utiliza una consultacount
anidada para contar el número de registros enPlayMateRequest
donderesponse
es igual a'reject'
. El operadornone
asegura que se cumpla la condición si el recuento es menor que 3.Ten en cuenta que para que esto funcione, necesitas tener
reject
como un valor válido para el camporesponse
enPlayMateRequest
.