如何解决Prisma 插入关系一对多
我阅读了关于作为 ORM 提供者的 Prisma,然后决定尝试一下。我目前在数据库查询方面的知识,尤其是 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
可以更轻松地创建或更新类别。
因此您可以按如下方式创建/更新类别:
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,})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。