Prisma 插入关系一对多

时间:2021-04-04 21:00:02

标签: sql postgresql 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 数据解决以下更新查询:

  1. 添加一个新类别并将其插入 category_name
  2. translations_categories 中添加此类别的给定翻译(在此步骤中,提供的信息包含 language_code,而不是 language_id!)

请求正文包含以下字段:

{
  id: 2
  identifier: "TEST-1"
  translations: {
    de: "german", 
    en: "english", 
    fr: "france", 
    it: "italian"
  }
}

出现了以下问题:

  1. 是否可以通过单个查询来实现此工作流程?
  2. 在插入 translation 时,我认为它自己提供的 language_code 是可能的,不是吗?

1 个答案:

答案 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 },
  },
})
相关问题