Вам трудно работать с Prisma/Graphql Один к одному и один ко многим

#sql #postgresql #graphql #prisma

Вопрос:

У меня много проблем с выяснением отношения 1 к 1 и 1 ко многим, я создал эту схему, а затем на ее основе получил свой graphql

 // This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model Games {
  id         Int      @id @default(autoincrement())
  createdAt  DateTime @default(now())
  updatedAt  DateTime @updatedAt
  short_hand String   @unique @db.VarChar(255)
  name       String   @unique @db.VarChar(255)
  in_boxes   Box[]
  set        Sets[]
}

model User {
  id         Int      @id @default(autoincrement())
  createdAt  DateTime @default(now())
  updatedAt  DateTime @updatedAt
  username   String   @unique @db.VarChar(255)
  password   String   @db.VarChar(255)
  role       Role     @default(USER)
  first_name String?  @db.VarChar(255)
  last_name  String?  @db.VarChar(255)
  store      String?  @db.VarChar(255)
  boxes      Box[]

}

model Store {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  name      String   @unique @db.VarChar(255)
}

model Box {
  id                Int      @id @default(autoincrement())
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt
  box_number        String   @db.VarChar(100)
  box_second_number String?   @db.VarChar(100)
  set               String   @db.VarChar(255)
  set_list          Sets     @relation(fields: [set], references: [name])
  gameid            Int?     @default(1)
  game              Games?   @relation(fields: [gameid], references: [id])
  User              User?    @relation(fields: [userId], references: [id])
  userId            Int?
}

model Sets {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  name      String   @unique @db.VarChar(255)
  code      String   @unique @db.VarChar(255)
  children  String[]
  in_boxes  Box[]
  game      String?  @db.VarChar(255)
  gamerel   Games?   @relation(fields: [game], references: [short_hand])
  edition   String?
}

enum Role {
  USER
  ADMIN
  CHRIS
}
 

В основном у пользователя будут собственные коробки (
Коробки имеют тип игры и содержат родительский набор, который
Имеет собственный код набора и содержит дочерние элементы набора (массив)
Тип игры сам по себе имеет только название и короткий код
Моя главная проблема заключается в том, что когда я пытаюсь создать набор с помощью кода распознавателя

 the graphql
mutation {
createBox (input:{box_number:"001", secondary_number:"A", game:{name:"yu"}, set:"Crucibile of War Unlimit"}) {
  box_number
  set
  game
  id
}
}
 

решатель

    createBox: async (_: any, { input }: any, context: Context) => {
      const find = await context.prisma.games.findFirst({
        where: {name: {contains:input.game[0].name,
        mode:"insensitive"}}
        }
      );
      console.log(find);
      console.log(input.set);
      return await context.prisma.box.create({
        data: {

          box_number: input.box_number,
          box_second_number: input.secondary_number,
          gameid: find?.id,
          set: {connect: {
              name: input.set
            },
          },

            },

 

      });
    },
 

Я получаю

             "  Foreign key constraint failed on the field: `Box_set_fkey (index)`",
            "    at cb 
 

Я действительно не понимаю, как заставить это работать

Ответ №1:

В этом случае set непосредственно ожидает отношения, поэтому вам здесь не нужно connect . Это должно сработать:

 const find = await prisma.games.findFirst({
    where: { name: { contains: input.game[0].name } },
  })

  await prisma.box.create({
    data: {
      box_number: input.box_number,
      box_second_number: input.secondary_number,
      gameid: find?.id,
      set: input.set,
    },
  })