Tutorial skema
Tutorial skemaPelajaran 7: Mengadaptasi konten secara massal

Pelajaran 7: Mengadaptasi konten secara massal

Pelajaran tutorial ini mengadaptasi konten secara massal, memperbarui judul, konten, dan kutipan untuk beberapa postingan dengan satu permintaan GraphQL.

Agar query GraphQL ini berfungsi, Konfigurasi Skema yang diterapkan pada endpoint perlu mengaktifkan Nested Mutations

Query GraphQL di bawah ini mengambil data untuk beberapa postingan, menjalankan pencarian dan penggantian pada kolom title, content, dan excerpt untuk masing-masingnya, mengadaptasinya sebagai input untuk mutasi, dan mengekspor satu variabel dinamis $postInputs dengan semua hasil sebagai kamus, dengan format:

{
  "${post ID}": {
    "title": "${adapted post title}",
    "excerpt": "${adapted post excerpt}"
  },
  // repeat for all other posts ...
}

Dalam operasi mutation, setiap entri ini kemudian diambil melalui _objectProperty (menggunakan ${post ID} sebagai kunci) dan diteruskan sebagai input untuk memperbarui postingan:

query TransformAndExportData(
  $limit: Int! = 5,
  $offset: Int! = 0,
  $replaceFrom: [String!]!
  $replaceTo: [String!]!
) {
  posts: posts(
    pagination: { limit: $limit, offset: $offset }
    sort: { by: ID, order: ASC }
  ) {
    rawTitle
    rawContent
    rawExcerpt
      @strReplaceMultiple(
        search: $replaceFrom
        replaceWith: $replaceTo
        affectAdditionalFieldsUnderPos: [1, 2]
      )
      @deferredExport(
        as: "postAdaptedSources"
        type: DICTIONARY
        affectAdditionalFieldsUnderPos: [1, 2]
      )
  }
}
 
query AdaptDataForMutationInput
  @depends(on: "TransformAndExportData")
{
  postInputs: _echo(value: $postAdaptedSources)
    @underEachJSONObjectProperty(
      passValueOnwardsAs: "adaptedSource",
      affectDirectivesUnderPos: [1, 2, 3, 4]
    )
      @applyField(
        name: "_objectProperty",
        arguments: {
          object: $adaptedSource,
          by: {
            key: "rawTitle"
          }
        },
        passOnwardsAs: "adaptedTitle"
      )
      @applyField(
        name: "_objectProperty",
        arguments: {
          object: $adaptedSource,
          by: {
            key: "rawExcerpt"
          }
        },
        passOnwardsAs: "adaptedExcerpt"
      )
      @applyField(
        name: "_objectProperty",
        arguments: {
          object: $adaptedSource,
          by: {
            key: "rawContent"
          }
        },
        passOnwardsAs: "adaptedContent"
      )
      @applyField(
        name: "_echo",
        arguments: {
          value: {
            title: $adaptedTitle,
            excerpt: $adaptedExcerpt,
            contentAs: {
              html: $adaptedContent
            }
          }
        },
        setResultInResponse: true
      )
    @export(as: "postInputs")
}
 
mutation UpdatePost(
  $limit: Int! = 5,
  $offset: Int! = 0
)
  @depends(on: "AdaptDataForMutationInput")
{
  adaptedPosts: posts(
    pagination: { limit: $limit, offset: $offset }
    sort: { by: ID, order: ASC }
  ) {
    id
    postInput: _objectProperty(
      object: $postInputs,
      by: { key: $__id }
    ) @remove
    update(input: $__postInput) {
      status
      errors {
        __typename
        ...on ErrorPayload {
          message
        }
      }
      post {
        title
        content
        excerpt
      }
    }
  }
}
  • Ekstensi Field on Field menyediakan direktif @applyField yang, saat dipanggil dengan _objectProperty, mengekstrak properti dari setiap item dalam objek JSON (yang diteruskan sebagai $adaptedSource), dan kemudian dengan _echo, membuat input JSON yang sesuai dengan properti-properti tersebut
  • Selain kolom fungsi, ekstensi PHP Functions via Schema juga menyediakan fungsionalitas melalui "direktif fungsi" yang bersesuaian, seperti @strReplaceMultiple
  • Ketika Multi-Field Directives diaktifkan, kita dapat menerapkan direktif ke lebih dari satu kolom, dengan menunjukkan posisi relatif dari kolom-kolom tambahan melalui argumen affectAdditionalFieldsUnderPos
  • Saat menerapkan direktif ke suatu kolom lalu mengekspor nilainya, kita harus menggunakan @deferredExport alih-alih @export
  • Saat menggunakan Multi-Field Directives bersama dengan @export (atau @deferredExport), nilai yang diekspor adalah objek JSON yang berisi semua kolom
  • Mutasi Post.update tersedia dalam skema hanya ketika fitur Nested Mutations diaktifkan