我阅读了关于作为 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
是可能的,不是吗?答案 0 :(得分:1)
我建议按以下方式创建架构:
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,
translations_categories: { create: translations },
},
})