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

  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 是可能的,不是吗?

我建议按以下方式创建模式:

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 },
  },
})