使用Prisma/Graphql一对一和一对多都很困难



我在计算1对1和1对多的关系时遇到了很多麻烦我创建了这个模式然后我得到了从它衍生出来的图形

// 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 

我真的很困惑如何使它工作

在这种情况下,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,
},
})

最新更新