es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 Y requestingUser = 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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Puedes utilizar una consulta count anidada y una subconsulta para lograr esta condición en prisma. Aquí te mostramos cómo puedes modificar tu código para incluir esta condición:

    const userId = 'testUser';
    
    return await this.prismaService.user.findMany({
      where: {
        NOT: {
          id: userId // no recuperar al propio usuario
        },
        lang: 'EN',
        incomingPlayMateRequest: {
          none: {
            AND: [{
              response: 'reject'
            }, {
              requestingUserId: userId
            }, {
              count: {
                response: 'reject'
              } // asegurarse de que la cuenta sea menor que 3
            }]
          }
        }
      }
    });
    

    En el código anterior, utilizamos none para excluir a los usuarios que cumplen con la condición especificada en el array AND. El array AND incluye tres condiciones: response: 'reject', requestingUserId: userId y count: { response: 'reject' }. Esta última condición utiliza una consulta count anidada para contar el número de registros en PlayMateRequest donde response es igual a 'reject'. El operador none 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 campo response en PlayMateRequest.

Comments are closed.