はじめに
先日に引き続きGraphQLを一から勉強し直していきます。
前回はこちら。
ミューテーション
GraphQLの書き方は変わらず、データのCreate(作成)・Update(更新)・Delete(削除)を行うことができる。
Create
create
enum Episode {
NEWHOPE
EMPIRE
JEDI
}
input ReviewInput {
stars: Int!
commentary: String
}
type Mutation {
createReview(episode: Episode, review: ReviewInput!): Review
}
Update
idと更新したいフィールドを引数として指定する。
以下の理由から特定のフィールドを更新するように定義することが推奨されている。
-
スキーマの表現力向上
- フィールド引数の入力タイプをNon-Nullにでき、クライアントが必要な値を確実に提供することを保証する
-
ランタイムロジックの削減
- 更新したい値が送信されたかをチェックするロジックが不要になる
update
type Mutation {
updateHumanName(id: ID!, name: String!): Human
}
Delete
削除対象のidを引数として指定する。
削除が成功したことを示すために、削除されたエンティティのidやpayloadを返すことが一般的。
delete
type Mutation {
deleteStarship(id: ID!): ID!
}
複数フィールド
ミューテーションではクエリ同様複数指定することが可能。
ただし、クエリは並列で実行されるのに対し、ミューテーションは直列で実行される。
例えばクエリは以下のように書いた場合、user
とposts
のクエリは同時に実行される。これは、パフォーマンスの向上や効率的なリソース利用・高速なレスポンスを担保するためである。
クエリ
query {
user(id: "1") {
name
email
}
posts(userId: "1") {
title
content
}
}
一方、ミューテーションは以下のように書いた場合、firstShip
が実行されてからsecondShip
が実行される。これは処理が競合しないようにするためである。
ただし、ロールバック機能はないため、secondShip
が失敗してもfirstShip
の処理は戻せない。
ミューテーション
mutation {
firstShip: deleteStarship(id: "3001")
secondShip: deleteStarship(id: "3002")
}
参考