Prisma 插入关系一对多

Posted

技术标签:

【中文标题】Prisma 插入关系一对多【英文标题】:Prisma insert relation one to many 【发布时间】:2021-06-30 21:21:35 【问题描述】:

我阅读了有关 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_nametranslations_categories 中添加此类别的给定翻译(在此步骤中,提供的信息包含language_code,而不是language_id!)

请求正文包含以下字段:


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

出现了以下问题:

    是否可以通过单个查询来实现此工作流程? 在插入translation 时,我认为提供的language_code 可以单独使用,不是吗?

【问题讨论】:

我不太明白你在这里想要做什么。您能具体解释一下更新查询是什么吗? 没问题,我会给出更详细的解释! 所以更新查询应该执行以下步骤: - 更新或创建一个带有标识符的新类别(不是唯一的!) - 也添加相关的翻译(存储在单独的表中) - 语言fk 从翻译表中引用的翻译所以我的问题是:如果我没有语言的唯一 ID,只有语言代码,我如何创建或更新这些翻译并将相关语言放在单个翻译中。对于给定的翻译(如果已经存在),lanuage_id 和 category_id 的组合将是唯一的 【参考方案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 ,
  ,
)

【讨论】:

是否可以使用 Prisma 删除级联?像 prima.categories.delete( where: id: id , include: translations: true )? 目前级联删除是not yet supported 用于多对多关系。我建议在请求中添加 ?,以便我们检查优先级。至于解决方法,您需要先删除关系数据,然后再删除父数据。

以上是关于Prisma 插入关系一对多的主要内容,如果未能解决你的问题,请参考以下文章

Prisma 可以从关系表中创建一对多关系吗?

prisma 模式中的一对多自关系

Prisma 上与 Self 的一对多关系

与附加字段的一对多关系

核心数据一对多插入与现有关系swift

EntityFramework 一对多关系重复插入问题