Prisma API:突變(Mutations)

本文屬使用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,或者如果具有該emailUser尚不存在课竣,就創(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
  }
}

注:createupdatecreateUserupdateUser突變中的數(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)

我們可以使用createupdate模型突變來(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ì)暴露嵌套的createconnect突變
  • 更新突變暴露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í)createconnect到多個(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突變的wheredata字段的對(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类缤,popremove尚未實(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
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市真慢,隨后出現(xiàn)的幾起案子毅臊,更是在濱河造成了極大的恐慌,老刑警劉巖黑界,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件管嬉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡朗鸠,警方通過(guò)查閱死者的電腦和手機(jī)蚯撩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)烛占,“玉大人胎挎,你說(shuō)我怎么就攤上這事。” “怎么了犹菇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵德迹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我项栏,道長(zhǎng)浦辨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任沼沈,我火速辦了婚禮流酬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘列另。我一直安慰自己芽腾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布页衙。 她就那樣靜靜地躺著摊滔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪店乐。 梳的紋絲不亂的頭發(fā)上艰躺,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音眨八,去河邊找鬼腺兴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛廉侧,可吹牛的內(nèi)容都是我干的页响。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼段誊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼闰蚕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起连舍,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤没陡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后索赏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诗鸭,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年参滴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了强岸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砾赔,死狀恐怖蝌箍,靈堂內(nèi)的尸體忽然破棺而出青灼,到底是詐尸還是另有隱情,我是刑警寧澤妓盲,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布杂拨,位于F島的核電站,受9級(jí)特大地震影響悯衬,放射性物質(zhì)發(fā)生泄漏弹沽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一筋粗、第九天 我趴在偏房一處隱蔽的房頂上張望策橘。 院中可真熱鬧,春花似錦娜亿、人聲如沸丽已。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沛婴。三九已至,卻和暖如春督赤,著一層夾襖步出監(jiān)牢的瞬間嘁灯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工躲舌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丑婿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓孽糖,卻偏偏與公主長(zhǎng)得像枯冈,于是被迫代替她去往敵國(guó)和親毅贮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子办悟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一天我們?nèi)コ曰疱仯热チ顺?jí)市場(chǎng)買(mǎi)了一些火鍋用的醬料滩褥,又去了一個(gè)小超市買(mǎi)了一點(diǎn)涮羊肉病蛉。 爸爸先下車去買(mǎi)羊肉的啦,而...
    幸福之家_871c閱讀 175評(píng)論 0 0
  • 大家說(shuō)生活讓我們變得堅(jiān)強(qiáng)瑰煎,與其說(shuō)堅(jiān)強(qiáng)的隱忍不能說(shuō)無(wú)奈的妥協(xié)铺然。 如果你的老婆很矯情,很自我酒甸,不順心就...
    4點(diǎn)半的恩賜閱讀 355評(píng)論 0 0
  • 經(jīng)常覺(jué)得自己日子過(guò)得渾渾噩噩魄健,不知道該干什么。感覺(jué)自己人生沒(méi)有目標(biāo)插勤,不知道該朝哪個(gè)方向去努力沽瘦,怎么破革骨?其實(shí),這就是...
    何麗娟_8c58閱讀 145評(píng)論 1 3
  • #人與動(dòng)物的區(qū)別最大的兩點(diǎn)(在目前我們也發(fā)現(xiàn)這其中還有很多其他復(fù)雜因素析恋,等待考究)良哲,就是語(yǔ)言和性行為。 #在人的1...
    奧利奧睡不醒閱讀 562評(píng)論 0 3