#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,
},
})