Cấu hình schema
Cấu hình schemaSử dụng nested mutations

Sử dụng nested mutations

Nested mutations cho phép thực hiện mutations trên một kiểu khác với kiểu gốc trong GraphQL.

Câu queries dưới đây thực thi một mutation tiêu chuẩn, sử dụng trường mutation updatePost từ kiểu gốc:

mutation {
  updatePost(input: {
    id: 5,
    title: "New title"
  }) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      title
    }
  }
}

Câu queries ở trên cũng có thể được thực thi thông qua một nested mutation, trong đó đối tượng post được truy vấn trước qua trường post, sau đó trường mutation update, thuộc kiểu Post, được áp dụng lên đối tượng post:

mutation {
  post(by: {id: 5}) {
    update(input: {
      title: "New title"
    }) {
      status
      post {
        title
      }
    }
  }
}

Các mutations cũng có thể được lồng nhau, chỉnh sửa dữ liệu trên kết quả của một mutation khác:

mutation {
  createPost(input: {
    title: "First title"
  }) {
    status
    postID
    post {
      update(input: {
        title: "Second title",
        contentAs: { html: "Some content" }
      }) {
        status
        post {
          title
          content
          addComment(input: {
            commentAs: { html: "My first comment" }
          }) {
            status
            commentID
            comment {
              content
              date
            }
          }
        }
      }
    }
  }
}

Kiểu gốc được đơn giản hóa

Nested mutations thay đổi kiểu gốc, từ QueryRootMutationRoot, thành một kiểu Root duy nhất xử lý cả queries lẫn mutations:

Nested mutations trong tài liệu schema

Trực quan hóa các trường mutation

Sử dụng client Voyager để trực quan hóa các trường mutation.

Với nested mutations, mọi kiểu trong schema đều có thể chứa cả trường query lẫn trường mutation. Để phân biệt chúng, phần mô tả của trường mutation được thêm tiền tố "[Mutation] ".

Ví dụ, đây là các trường của kiểu Root:

Mô tả cho kiểu Root trong tài liệu GraphiQL

Sử dụng nested mutations trong các endpoint

Có 2 cấp độ mà chúng ta có thể xác định liệu schema có sử dụng nested mutations hay không. Theo thứ tự ưu tiên:

1. Trong cấu hình schema

Việc để một custom endpoint hoặc persisted query sử dụng nested mutations có thể được xác định thông qua cấu hình schema tương ứng:

Sơ đồ mutation trong cấu hình schema

2. Chế độ mặc định, được xác định trong Cài đặt

Nếu cấu hình schema có giá trị "Default", nó sẽ sử dụng chế độ được xác định trong Cài đặt:

Cài đặt cho nested mutations
Cài đặt cho nested mutations

Cấu hình nested mutations

Có ba hành vi chúng ta có thể chọn cho schema:

1. Không bật nested mutations

Tùy chọn này vô hiệu hóa nested mutations (sử dụng hành vi tiêu chuẩn thay thế) cho schema.

2. Bật nested mutations, giữ lại tất cả các trường mutation trong kiểu gốc

Khi nested mutations được bật, các trường mutation có thể được thêm hai lần vào schema:

  • một lần dưới kiểu Root
  • một lần dưới kiểu cụ thể

Ví dụ:

  • Root.updatePost
  • Post.update

Với tùy chọn này, các trường mutation "trùng lặp" từ kiểu gốc được giữ lại.

3. Bật nested mutations, xóa các trường mutation dư thừa khỏi kiểu gốc

Tương tự tùy chọn trên, nhưng xóa các trường mutation "trùng lặp" khỏi kiểu gốc.

Ví dụ:

  • Root.updatePost bị xóa
  • Post.update khả dụng

Đặc tả GraphQL

Chức năng này hiện chưa phải là một phần của đặc tả GraphQL, nhưng đã được đề xuất: