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.

Next js con Prisma: Upsert basado en dos condiciones.

Estoy intentando hacer lo siguiente usando Prisma:

Si ya existe una fila de categoría con el mismo hash e user_id, solo actualiza el campo “name”, de lo contrario, crea la fila.

¿Es esto posible? TS me da un error diciendo que el tipo de la clave dada en “where” debe ser de categoriesWhereUniqueInput, sin embargo, ni hash ni user_id son únicos, pueden repetirse, es la combinación entre los dos lo que va a ser única

¿Cómo puedo solucionar esto? ¿Tengo que verificar manualmente si hay un id y actualizar/crear en base a eso?

¡Muchas gracias de antemano!

  const category = await prisma.categories.upsert({
    where: {
      hash,
      user_id: id,
    },
    update: {
      name,
    },
    create: {
      hash,
      name,
      user_id: id,
    },
  });
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la funcionalidad deseada, puedes crear una restricción única compuesta en tu tabla de categorías que incluya tanto las columnas de hash como las de user_id. Esto le indica a la base de datos que aplique la unicidad a la combinación de esas dos columnas juntas.

    Luego, en tu esquema de Prisma, puedes especificar esta restricción única compuesta utilizando el decorador @@unique:

    model Category {
      id        Int      @id @default(autoincrement())
      hash      String
      name      String
      user_id   Int
    
      @@unique([hash, user_id])
    }
    

    Con esta restricción en su lugar, puedes modificar tu llamada upsert de Prisma para usar un objeto categoriesWhereInput en los bloques de create y update.

    A continuación, te mostramos un ejemplo de cómo podría verse la llamada actualizada upsert:

    const category = await prisma.categories.upsert({
      where: {
        hash_user_id: {
          hash,
          user_id: id,
        },
      },
      update: {
        name,
      },
      create: {
        hash,
        name,
        user_id: id,
      },
    });
    

    Observa que en el bloque where, estamos utilizando un objeto con la propiedad hash_user_id que contiene los valores para hash y user_id. Esto coincide con el formato de nuestra restricción única compuesta, y permite que Prisma busque correctamente la fila de categoría existente.

    Con estos cambios en su lugar, deberías poder lograr la funcionalidad deseada utilizando Prisma.

Comments are closed.