Prisma 插入关系一对多
Prisma insert relation one to many
我读到有关 prisma 作为 ORM 提供程序的信息,然后决定尝试一下。我目前在数据库查询方面的知识尤其是 postrgres 方面的知识不是很丰富,所以我遇到了需要一些帮助以获得正确解决方案的情况。
让我们假设以下 schema.prisma
:
model languages {
language_id Int @id @default(autoincrement())
language_code String @db.VarChar
translations_categories translations_categories[]
}
model categories {
category_id Int @id @default(autoincrement())
category_name String @db.VarChar
translations_categories translations_categories[]
}
model translations_categories {
translation_id Int @id @default(autoincrement())
language_id Int
category_id Int
translation_value String @db.VarChar
categories categories @relation(fields: [category_id], references: [category_id])
language languages @relation(fields: [language_id], references: [language_id])
}
所以我尝试用一些 api 数据解决以下更新查询:
- 添加新类别并将其插入
category_name
- 在
translations_categories
中添加该类别的给定翻译(在此步骤中,提供的信息包含 language_code
,而不是 language_id
!)
请求正文包含以下字段:
{
id: 2
identifier: "TEST-1"
translations: {
de: "german",
en: "english",
fr: "france",
it: "italian"
}
}
出现了以下问题:
- 是否可以通过单个查询实现此工作流程?
- 当插入
translation
时,我认为通过提供的 language_code
是可能的,不是吗?
我建议按以下方式创建模式:
model languages {
language_id Int @id @default(autoincrement())
language_code String @unique
translations_categories translations_categories[]
}
model categories {
category_id Int @id @default(autoincrement())
category_name String
translations_categories translations_categories[]
}
model translations_categories {
translation_id Int @id @default(autoincrement())
language_id Int
category_id Int
translation_value String
categories categories @relation(fields: [category_id], references: [category_id])
language languages @relation(fields: [language_id], references: [language_id])
@@unique([language_id, category_id])
}
这样做的原因是 language_code
对于每种语言总是唯一的,因此使用 @unique
可以更容易地创建或更新类别。
所以你可以create/update类别如下:
let data = {
id: 2,
identifier: 'TEST-1',
translations: {
de: 'german',
en: 'english',
fr: 'france',
it: 'italian',
},
}
let translations = Object.entries(data.translations).map(([key, val]) => ({
language: {
connectOrCreate: {
where: { language_code: key },
create: { language_code: key },
},
},
translation_value: val,
}))
await prisma.categories.upsert({
where: { category_id: data.id },
create: {
category_name: data.identifier,
translations_categories: { create: translations },
},
update: {
category_name: data.identifier,
translations_categories: { create: translations },
},
})
我读到有关 prisma 作为 ORM 提供程序的信息,然后决定尝试一下。我目前在数据库查询方面的知识尤其是 postrgres 方面的知识不是很丰富,所以我遇到了需要一些帮助以获得正确解决方案的情况。
让我们假设以下 schema.prisma
:
model languages {
language_id Int @id @default(autoincrement())
language_code String @db.VarChar
translations_categories translations_categories[]
}
model categories {
category_id Int @id @default(autoincrement())
category_name String @db.VarChar
translations_categories translations_categories[]
}
model translations_categories {
translation_id Int @id @default(autoincrement())
language_id Int
category_id Int
translation_value String @db.VarChar
categories categories @relation(fields: [category_id], references: [category_id])
language languages @relation(fields: [language_id], references: [language_id])
}
所以我尝试用一些 api 数据解决以下更新查询:
- 添加新类别并将其插入
category_name
- 在
translations_categories
中添加该类别的给定翻译(在此步骤中,提供的信息包含language_code
,而不是language_id
!)
请求正文包含以下字段:
{
id: 2
identifier: "TEST-1"
translations: {
de: "german",
en: "english",
fr: "france",
it: "italian"
}
}
出现了以下问题:
- 是否可以通过单个查询实现此工作流程?
- 当插入
translation
时,我认为通过提供的language_code
是可能的,不是吗?
我建议按以下方式创建模式:
model languages {
language_id Int @id @default(autoincrement())
language_code String @unique
translations_categories translations_categories[]
}
model categories {
category_id Int @id @default(autoincrement())
category_name String
translations_categories translations_categories[]
}
model translations_categories {
translation_id Int @id @default(autoincrement())
language_id Int
category_id Int
translation_value String
categories categories @relation(fields: [category_id], references: [category_id])
language languages @relation(fields: [language_id], references: [language_id])
@@unique([language_id, category_id])
}
这样做的原因是 language_code
对于每种语言总是唯一的,因此使用 @unique
可以更容易地创建或更新类别。
所以你可以create/update类别如下:
let data = {
id: 2,
identifier: 'TEST-1',
translations: {
de: 'german',
en: 'english',
fr: 'france',
it: 'italian',
},
}
let translations = Object.entries(data.translations).map(([key, val]) => ({
language: {
connectOrCreate: {
where: { language_code: key },
create: { language_code: key },
},
},
translation_value: val,
}))
await prisma.categories.upsert({
where: { category_id: data.id },
create: {
category_name: data.identifier,
translations_categories: { create: translations },
},
update: {
category_name: data.identifier,
translations_categories: { create: translations },
},
})