[GraphQL] 5. Query & 6. Mutation


Query実装-Code
Query : 데이터 조회
Mutation : 데이터 추가, 수정, 삭제
Queryルートタイプ
type Query {
    teams: [Team]
}
定義
  • 要求で使用するクエリ
  • クエリー文ごとに返されるデータ型
  • を指定します.
    Type
    type Team {
        id: Int
        manager: String
        office: String
        extension_number: String
        mascot: String
        cleaning_duty: String
        project: String
    }
  • 返されるデータのフォーマット
  • を指定します.
  • データ型フィールド
  • Resolver
    const resolvers = {
      Query: {
        teams: () => database.teams
      }
    }
  • Queryは、オブジェクト内のアイテムにデータを返す関数宣言です.
  • 実際のプロジェクトでは、MySQLクエリーコードなど...
  • マルチステーション実装-Code
    デバイスデータの追加
    マルチステーション-その他のルートタイプ
    type Mutation {
        insertEquipment(
            id: String,
            used_by: String,
            count: Int,
            new_or_used: String
        ): Equipment
        ...
    }
    Resolver
    Mutation: {
        insertEquipment: (parent, args, context, info) => {
            database.equipments.push(args)
            return args
        },
        //...
    }
  • SQLのINSERT文など
  • を実現
    Test
    mutation {
      insertEquipment (
        id: "laptop",
        used_by: "developer",
        count: 17,
        new_or_used: "new"
      ) {
        id
        used_by
        count
        new_or_used
      }
    }
    デバイスデータの変更
    マルチステーション-ルートタイプの変更
    type Mutation {
        editEquipment(
            id: String,
            used_by: String,
            count: Int,
            new_or_used: String
        ): Equipment
        ...
    }
    Resolver
    Mutation: {
        // ...
        editEquipment: (parent, args, context, info) => {
            return database.equipments.filter((equipment) => {
                return equipment.id === args.id
            }).map((equipment) => {
                Object.assign(equipment, args)
                return equipment
            })[0]
        },
        // ...
    }
  • SQLのUPDATE文など
  • を実現
    Test
    mutation {
      editEquipment (
        id: "pen tablet",
        new_or_used: "new",
        count: 30,
        used_by: "designer"
      ) {
        id
        new_or_used
        count
        used_by
      }
    }
    デバイスデータの削除
    マルチステーション-ルートタイプの削除
    type Mutation {
        deleteEquipment(id: String): Equipment
    }
    Resolver
    Mutation: {
          deleteEquipment: (parent, args, context, info) => {
              const deleted = database.equipments
                  .filter((equipment) => {
                      return equipment.id === args.id
                  })[0]
              database.equipments = database.equipments
                  .filter((equipment) => {
                      return equipment.id !== args.id
                  })
              return deleted
          }
    }
  • 削除後、受信データを結果値として削除する変数
  • に保存する.
  • データからデータを削除する、その削除を
  • に戻す.
  • 実際のプロジェクトはSQLのDELETE文などを用いて
  • を実現する.
    Test
    mutation {
      deleteEquipment(id: "notebook") {
        id
        used_by
        count
        new_or_used
      }
    }
    Reference
    https://www.yalco.kr/@graphql-apollo/2-2/
    https://www.yalco.kr/@graphql-apollo/2-3/