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.

Cómo crear una nueva relación de muchos a muchos con registros existentes?

Tengo una relación de muchos a muchos que modela una pelea de boxeo:

  • Una pelea puede tener varios luchadores (siempre 2)
  • Un luchador puede estar en varias peleas

Mi esquema se ve así:

model Fight {
  id            Int     @id @default(autoincrement())
  fighters      FighterFights[]
}

model Fighter {
  id        Int     @id @default(autoincrement())
  name      String  @unique
  fights    FighterFights[]
}

model FighterFights {
  fighter      Fighter     @relation(fields: [fighterId], references: [id])
  fighterId    Int
  fight        Fight @relation(fields: [fightId], references: [id])
  fightId      Int

  @@id([fighterId, fightId])
}

Quiero crear una nueva pelea con 2 luchadores existentes. Esto es lo que he intentado:

const result = await prisma.fight.create({
  data: {
    fighters: {
      connect: [{ id: fighter1 }, { id: fighter2 }],
    },
  },
})

Pero obtengo este error de TypeScript:

Type '{ id: any; }' is not assignable to type 'FighterFightsWhereUniqueInput'.
  Object literal may only specify known properties, and 'id' does not exist in type 'FighterFightsWhereUniqueInput'.

¿Cómo debería verse la invocación de mi función prisma.fight.create?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el error de TypeScript, necesitas actualizar el parámetro “data” de prisma.fight.create para utilizar el método connect en el campo “fighters”. Aquí tienes un ejemplo de cómo debería verse la invocación de la función:

    const result = await prisma.fight.create({
      data: {
        fighters: {
          connect: [
            { fighterId: fighter1.id, fightId: result.id },
            { fighterId: fighter2.id, fightId: result.id },
          ],
        },
      },
    });
    

    En este ejemplo, primero creamos el objeto Fight utilizando prisma.fight.create. Una vez que se crea el objeto Fight, utilizamos el result.id para conectar los dos registros de Fighter utilizando el método connect en el campo “fighters”.

    Ten en cuenta que utilizamos el campo id en tu ejemplo original. Sin embargo, dado que la tabla FighterFights tiene una clave primaria compuesta por fighterId y fightId, necesitamos utilizar un objeto con esos campos para identificar de manera única un registro en el método connect.

Comments are closed.