本文屬使用Prisma構(gòu)建GraphQL服務(wù)系列脾还。
Prisma API提供:
- 簡(jiǎn)單突變:創(chuàng)建吠式,更新,插入和刪除特定對(duì)象類型的單個(gè)節(jié)點(diǎn)
- 批量突變:更新和刪除某個(gè)模型的許多節(jié)點(diǎn)
- 關(guān)系突變:連接巩那,斷開(kāi)悟狱,創(chuàng)建,更新和上傳跨關(guān)系的節(jié)點(diǎn)
通常磷籍,服務(wù)的Prisma API是基于其數(shù)據(jù)模型生成的适荣。要探索Prisma API中的操作,可以使用GraphQL Playground院领。
在下文中弛矛,我們將探索基于此數(shù)據(jù)模型的基于Prisma服務(wù)的示例查詢:
type Post {
id: ID! @unique
title: String!
published: Boolean!
author: User!
}
type User {
id: ID! @unique
age: Int
email: String! @unique
name: String!
posts: [Post!]!
}
對(duì)象突變(Object mutations)
我們可以使用模型突變來(lái)修改某個(gè)模型的單個(gè)節(jié)點(diǎn)。
創(chuàng)建節(jié)點(diǎn)(Creating nodes)
在這里比然,我們使用createUser
突變來(lái)創(chuàng)建一個(gè)新用戶:
# Create a new user
mutation {
createUser(
data: {
age: 42
email: "zeus@example.com"
name: "Zeus"
}
) {
id
name
}
}
注意:無(wú)默認(rèn)值的必填字段汪诉,需要在數(shù)據(jù)輸入對(duì)象中指定。
修改節(jié)點(diǎn)(Updating nodes)
我們可以使用updateUser更改電子郵件和名稱。請(qǐng)注意扒寄,我們正在使用where
參數(shù)選擇要更新的節(jié)點(diǎn):
mutation {
updateUser(
data: {
email: "zeus2@example.com"
name: "Zeus2"
}
where: {
email: "zeus@example.com"
}
) {
id
name
}
}
修改插入(Upserting nodes)
當(dāng)我們想要更新現(xiàn)有的節(jié)點(diǎn)鱼鼓,或者在單個(gè)突變中創(chuàng)建一個(gè)新節(jié)點(diǎn)時(shí),我們可以使用upsert突變该编。
在這里迄本,我們使用upsertUser
通過(guò)某個(gè)email
更新User
,或者如果具有該email
的User
尚不存在课竣,就創(chuàng)建一個(gè)新User
:
# Upsert a user
mutation {
upsertUser(
where: {
email: "zeus@example.com"
}
create: {
email: "zeus@example.com"
age: 42
name: "Zeus"
}
update: {
name: "Another Zeus"
}
) {
name
}
}
注:
create
和update
與createUser
和updateUser
突變中的數(shù)據(jù)對(duì)象具有相同的類型嘉赎。
刪除節(jié)點(diǎn)(Deleting nodes)
要?jiǎng)h除節(jié)點(diǎn),我們所要做的就是使用delete
突變刪除選擇的節(jié)點(diǎn)于樟。
在這里公条,我們使用deleteUser
突變,通過(guò)它的id
刪除一個(gè)User
:
mutation {
deleteUser(where: {
id: "cjcdi63l20adx0146vg20j1ck"
}) {
id
name
email
}
}
由于email
用@unique
指令標(biāo)記迂曲,我們也可以通過(guò)他們的email
選擇(并因此刪除)User
節(jié)點(diǎn):
mutation {
deleteUser(where: {
email: "cjcdi63l20adx0146vg20j1ck"
}) {
id
name
email
}
}
嵌套突變(Nested mutations)
我們可以使用create
和update
模型突變來(lái)同時(shí)修改關(guān)系中的節(jié)點(diǎn)靶橱。這被稱為嵌套的突變,并被事務(wù)執(zhí)行路捧。
概述(Overview)
存在幾個(gè)嵌套突變參數(shù):
create
update
upsert
delete
connect
disconnect
它們的可用性和確切的行為取決于以下兩個(gè)參數(shù):
- 父突變類型
-
create
突變 -
update
突變 -
upsert
突變
-
- 關(guān)系的類型
- 可選的一對(duì)一關(guān)系
- 必須的一對(duì)一關(guān)系
- 一對(duì)多關(guān)系
例如:
- 創(chuàng)建突變只會(huì)暴露嵌套的
create
和connect
突變 - 更新突變暴露
update
关霸,upsert
突變?yōu)楸匦璧囊粚?duì)一關(guān)系
栗子(Examples)
在這一點(diǎn)上,我們不提供所有可能的場(chǎng)景杰扫,而是提供一個(gè)例子列表队寇。
建議使用GraphQL Playground查看不同嵌套突變的行為。
創(chuàng)建并連接相關(guān)節(jié)點(diǎn)
我們可以在嵌套的輸入對(duì)象字段中使用連接操作來(lái)連接到一個(gè)或多個(gè)相關(guān)節(jié)點(diǎn)章姓。
在這里佳遣,我們正在創(chuàng)建一個(gè)新的Post
并通過(guò)唯一的email
字段connect
到現(xiàn)有的author
。在這種情況下凡伊,connect
為節(jié)點(diǎn)選擇提供了一種方法:
# Create a post and connect it to an author
mutation {
createPost(data: {
title: "This is a draft"
published: false
author: {
connect: {
email: "zeus@example.com"
}
}
}) {
id
author {
name
}
}
}
如果我們?cè)?code>author中提供create
參數(shù)而不是connect
苍日,我們將創(chuàng)建一個(gè)相關(guān)author
并同時(shí)connect
到它,而不是connect
到現(xiàn)有的author
窗声。
在創(chuàng)建User
而不是Post
時(shí)相恃,我們實(shí)際上可以同時(shí)create
并connect
到多個(gè)Post
節(jié)點(diǎn),因?yàn)?code>User具有多對(duì)多的Post
笨觅。
在這里拦耐,我們正在create
一個(gè)新User
并直接將其連接到幾個(gè)新的和現(xiàn)有的Post
節(jié)點(diǎn):
# Create a user, create and connect new posts, and connect to existing posts
mutation {
createUser(
data: {
email: "zeus@example.com"
name: "Zeus"
age: 42
posts: {
create: [{
published: true
title: "First blog post"
}, {
published: true
title: "Second blog post"
}]
connect: [{
id: "cjcdi63j80adw0146z7r59bn5"
}, {
id: "cjcdi63l80ady014658ud1u02"
}]
}
}
) {
id
posts {
id
}
}
}
更新(updating)和更新插入(upserting)相關(guān)節(jié)點(diǎn)
更新節(jié)點(diǎn)時(shí),可以同時(shí)更新一個(gè)或多個(gè)相關(guān)節(jié)點(diǎn)见剩。
mutation {
updateUser(
data: {
posts: {
update: [{
where: {
id: "cjcf1cj0r017z014605713ym0"
}
data: {
title: "Hello World"
}
}]
}
}
where: {
id: "cjcf1cj0c017y01461c6enbfe"
}
) {
id
}
}
請(qǐng)注意杀糯,
update
接受包含適合updatePost
突變的where
和data
字段的對(duì)象列表。
嵌套更新插入(upserting)類似:
mutation {
updatePost(
where: {
id: "cjcf1cj0r017z014605713ym0"
}
data: {
author: {
upsert: {
where: {
id: "cjcf1cj0c017y01461c6enbfe"
}
update: {
email: "zeus2@example.com"
name: "Zeus2"
}
create: {
email: "zeus@example.com"
name: "Zeus"
}
}
}
}
) {
id
}
}
刪除相關(guān)節(jié)點(diǎn)
更新節(jié)點(diǎn)時(shí)苍苞,可以同時(shí)刪除一個(gè)或多個(gè)相關(guān)節(jié)點(diǎn)固翰。在這種情況下狼纬,delete
提供了一種節(jié)點(diǎn)選擇方式:
mutation {
updateUser(
data: {
posts: {
delete: [{
id: "cjcf1cj0u01800146jii8h8ch"
}, {
id: "cjcf1cj0u01810146m84cnt34"
}]
}
}
where: {
id: "cjcf1cj0c017y01461c6enbfe"
}
) {
id
}
}
標(biāo)量列表突變(Scalar list mutations)
當(dāng)一個(gè)對(duì)象類型有一個(gè)標(biāo)量列表作為其類型的字段時(shí),有許多特殊的突變可用骂际。
在以下數(shù)據(jù)模型中疗琉,User
類型有三個(gè)這樣的字段:
type User {
id: ID! @unique
scores: [Int!]! # scalar list for integers
friends: [String!]! # scalar list for strings
coinFlips: [Boolean!]! # scalar list for booleans
}
創(chuàng)建節(jié)點(diǎn)(Creating nodes)
創(chuàng)建類型為User
的新節(jié)點(diǎn)時(shí),可以使用set
為每個(gè)標(biāo)量列表字段提供一個(gè)值列表歉铝。
例如:
mutation {
createUser(data: {
scores: { set: [1, 2, 3] }
friends: { set: ["Sarah", "Jane"] }
throws: { set: [false, false] }
}) {
id
}
}
更新節(jié)點(diǎn)(Updating nodes)
更新User
類型的現(xiàn)有節(jié)點(diǎn)時(shí)盈简,可以在標(biāo)量列表字段上執(zhí)行一些附加操作:
-
set
:用一個(gè)全新的列表覆蓋現(xiàn)有列表。 -
push
(coming soon):在列表中的任何位置添加一個(gè)或多個(gè)元素太示。 -
pop
(coming soon):從列表的開(kāi)頭或結(jié)尾刪除一個(gè)或多個(gè)元素柠贤。 -
remove
(coming soon):刪除列表中與給定過(guò)濾器匹配的所有元素。
注意:
push
类缤,pop
和remove
尚未實(shí)現(xiàn)臼勉。如果你真的好奇這些將會(huì)是什么樣子,你可以在相應(yīng)的規(guī)范(specification)中看到預(yù)覽餐弱。
set
每個(gè)標(biāo)量列表字段都會(huì)在update
突變中使用具有set
字段的對(duì)象宴霸。該字段的值是單個(gè)值或相應(yīng)標(biāo)量類型的列表。
栗子:將現(xiàn)有User
節(jié)點(diǎn)的scores
設(shè)置為[1]:
mutation {
updateUser(
where: {
id: "cjd4lfdyww0h00144zst9alur"
}
data: {
scores: {
set: 1
}
}
) {
id
}
}
將現(xiàn)有User
節(jié)點(diǎn)的scores
設(shè)置為[10,20,30]:
mutation {
updateUser(
where: {
id: "cjd4lfdyww0h00144zst9alur"
}
data: {
scores: {
set: [10,20,30]
}
}
) {
id
}
}
批量突變(Batch Mutations)
批處理突變可用于一次更新或刪除多個(gè)節(jié)點(diǎn)岸裙。返回的數(shù)據(jù)只包含受影響節(jié)點(diǎn)的數(shù)量。
為了更新許多節(jié)點(diǎn)速缆,可以使用where
參數(shù)選擇受影響的節(jié)點(diǎn)降允,同時(shí)用data
指定新值。所有節(jié)點(diǎn)將更新為相同的值艺糜。
請(qǐng)注意剧董,批量突變不會(huì)觸發(fā)訂閱事件!
在這里破停,我們正在發(fā)布在2017年創(chuàng)建的所有未發(fā)布的Post
節(jié)點(diǎn):
mutation {
updateManyPosts(
where: {
createdAt_gte: "2017"
createdAt_lt: "2018"
published: false
}
data: {
published: true
}
) {
count
}
}
在這里翅楼,我們刪除某個(gè)作者的所有未發(fā)布的Post節(jié)點(diǎn):
mutation {
deleteManyPosts(
where: {
published: false
author: {
name: "Zeus"
}
}
) {
count
}
}