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_name
在translations_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 插入关系一对多的主要内容,如果未能解决你的问题,请参考以下文章