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.

Mejor manera de consultar si existe una relación muchos a muchos a través de Prisma en una consulta de findMany.

Estoy usando el ORM Prisma para consultar publicaciones. Mi modelo de publicación se ve así:

model Post {
  id      String   @id @default(uuid())
  content String @db.VarChar(1000)
  created DateTime @default(now())
  cursorNo Int @default(autoincrement())

  user   User   @relation(fields: [userId], references: [id], name: "postuser")
  userId String

  likes User[] @relation(references: [id], name: "postlikes")

}

Y mi modelo de usuario se ve así:

model User {
  id        String  @id @default(uuid())
  firstname String
  lastname  String?
  username  String  @unique
  email     String  @unique
  password  String

  isActive Boolean @default(false)

  posts Post[] @relation(name: "postuser")
  liked_posts Post[]  @relation(name: "postlikes")

}

Quiero escribir una consulta que devuelva un valor verdadero o falso en función de si el usuario que realiza la consulta ha dado o no “me gusta” a esa publicación, y estoy usando el método findMany() para eso. Quiero que el resultado final de mi consulta se vea así:

[
{
    id: 1,
    content: "Este es el contenido"
    isLiked: False
},
{
    id: 2,
    content: "Este es el contenido 2"
    isLiked: True
}
]

¿Cuál sería la forma más optimizada de implementar esto usando Prisma ORM y Postgres?

Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para implementar esto usando Prisma ORM y Postgres, puede usar una consulta SQL cruda con LEFT JOIN y una sentencia CASE. Aquí hay un ejemplo de consulta:

    const userId = 'user123456'
    const posts = await prisma.$queryRaw`
      SELECT
        Post.*,
        CASE
          WHEN likes."userId" = ${userId} THEN true
          ELSE false
        END as "isLiked"
      FROM
        Post
        LEFT JOIN "PostLikes" likes ON likes."postId" = Post.id AND likes."userId" = ${userId}
    `
    
    console.log(posts)
    

    Esta consulta utiliza JOIN para unir la tabla PostLikes a la tabla Post. También utiliza una sentencia CASE para verificar si el ID del usuario actual coincide con el ID en la tabla PostLikes. Si es así, entonces isLiked se establece en true, de lo contrario se establece en false.

    Tenga en cuenta que esta consulta asume que tiene una tabla PostLikes que contiene una columna postId y una columna userId, y que está utilizando las convenciones de nomenclatura predeterminadas para las relaciones de Prisma. Si tiene nombres diferentes, deberá ajustar la consulta en consecuencia.

Comments are closed.