1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Basic Study LogAdvent Calendar 2024

Day 20

GraphQLを1から勉強しなおしてみた ~ ミューテーション ~

Posted at

はじめに

先日に引き続き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と更新したいフィールドを引数として指定する。

以下の理由から特定のフィールドを更新するように定義することが推奨されている。

  1. スキーマの表現力向上
    • フィールド引数の入力タイプをNon-Nullにでき、クライアントが必要な値を確実に提供することを保証する
  2. ランタイムロジックの削減
    • 更新したい値が送信されたかをチェックするロジックが不要になる
update
type Mutation {
  updateHumanName(id: ID!, name: String!): Human
}

Delete

削除対象のidを引数として指定する。

削除が成功したことを示すために、削除されたエンティティのidやpayloadを返すことが一般的。

delete
type Mutation {
  deleteStarship(id: ID!): ID!
}

複数フィールド

ミューテーションではクエリ同様複数指定することが可能。

ただし、クエリは並列で実行されるのに対し、ミューテーションは直列で実行される。

例えばクエリは以下のように書いた場合、userpostsのクエリは同時に実行される。これは、パフォーマンスの向上や効率的なリソース利用・高速なレスポンスを担保するためである。

クエリ
query {
  user(id: "1") {
    name
    email
  }
  posts(userId: "1") {
    title
    content
  }
}

一方、ミューテーションは以下のように書いた場合、firstShipが実行されてからsecondShipが実行される。これは処理が競合しないようにするためである。

ただし、ロールバック機能はないため、secondShipが失敗してもfirstShipの処理は戻せない。

ミューテーション
mutation { 
  firstShip: deleteStarship(id: "3001")
  secondShip: deleteStarship(id: "3002")
}

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?