Query Functions
Query FunctionsField To Input

Field To Input

Included in the “Power Extensions” bundle

Bir alanın değerini alın, işleyin ve aynı işlem içinde başka bir alana ya da direktife girdi olarak aktarın.

field alanının değerini $__field aracılığıyla başka bir alana, field @passOnwards(as: "variableName") aracılığıyla ise bir direktife girdi olarak aktarın.

$__field

Alan değerini başka bir alana girdi olarak aktarın. Alan değerine başvurmak için kullanılan sözdizimi şöyledir: $ (GraphQL'deki değişken sembolü), ardından __ ve alanın takma adı ya da adı.

Örneğin, excerpt alanının değerine $__excerpt olarak, postTitle: title alanına ise $__postTitle olarak başvurulur.

İkinci alanın yanıtı da başka bir alana girdi olarak kullanılabilir:

{
  posts {
    excerpt
 
    # Referencing previous field with name "excerpt"
    isEmptyExcerpt: _isEmpty(value: $__excerpt)
 
    # Referencing previous field with alias "isEmptyExcerpt"
    isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
  }
}

Yanıt şu şekilde olacaktır:

{
  "data": {
    "posts": [
      {
        "excerpt": "Some post excerpt",
        "isEmptyExcerpt": false,
        "isNotEmptyExcerpt": true
      },
      {
        "excerpt": "",
        "isEmptyExcerpt": true,
        "isNotEmptyExcerpt": false
      }
    ]
  }
}
# This will fail because the reference to the field must appear after the field, not before
{
  posts {
    isEmptyExcerpt: _isEmpty(value: $__excerpt)
    excerpt
  }
}
 
# This will fail because the reference must be done within the same node
{
  posts {
    excerpt
  }
  isEmptyExcerpt: _isEmpty(value: $__excerpt)
}

Alana bir direktif argümanından da başvurulamaz (bunun için @passOnwards kullanın):

# This will fail because the reference can be only used as input to a field, not to a directive
{
  posts {
    hasComments
    title @include(if: $__hasComments)
  }
}

@passOnwards

@passOnwards direktifi, alanın çözümlenmiş değerini dinamik bir değişken aracılığıyla sonraki direktiflere kullanılabilir hale getirir.

Aşağıdaki query'de, notHasComments alanı; hasComments alanının değeri alınarak ve bunun karşıt değeri hesaplanarak oluşturulur. Bu şu şekilde çalışır:

  • Alanın değeri @passOnwards aracılığıyla kullanılabilir hale getirilir; ardından bu değer sonraki herhangi bir direktife girdi olarak verilebilir
  • @applyField, girdiyi (dinamik değişken $postHasComments altında dışa aktarılan) alır, üzerine global not alanını uygular ve sonucu alana geri kaydeder
{
  posts {
    id
    hasComments
    notHasComments: hasComments
      @passOnwards(as: "postHasComments")
      @applyField(
        name: "_not"
        arguments: {
          value: $postHasComments
        },
        setResultInResponse: true
      )
  }
}

Bu şunu üretecektir:

{
  "data": {
    "posts": [
      {
        "id": 1724,
        "hasComments": true,
        "notHasComments": false
      },
      {
        "id": 358,
        "hasComments": false,
        "notHasComments": true
      },
      {
        "id": 555,
        "hasComments": false,
        "notHasComments": true
      }
    ]
  }
}

property argümanı altında takma adı ya da alan adını geçirerek nesnedeki herhangi bir çözümlenmiş alanın değerini de alabiliriz.

Örneğin, bu query'de çözümlenmiş değere id alan adı veya second takma adıyla erişiyor ve bu değeri sonraki bir query'de yazdırmak üzere dinamik bir değişken aracılığıyla dışa aktarıyoruz:

query One {
  id
  second: _echo(value: 2)
    @passOnwards(
      property: "id",
      as: "resolvedFirstValue"
    )
    @exportFrom(
      scopedDynamicVariable: $resolvedFirstValue,
      as: "firstValue"
    )
  third: _echo(value: 3)
    @passOnwards(
      property: "second",
      as: "resolvedSecondValue"
    )
    @exportFrom(
      scopedDynamicVariable: $resolvedSecondValue,
      as: "secondValue"
    )
}
 
query Two @depends(on: "One") {
  firstValue: _echo(value: $firstValue)
  secondValue: _echo(value: $secondValue)
}

Bu şunu üretecektir:

{
  "data": {
    "id": "root",
    "second": 2,
    "third": 3,
    "firstValue": "root",
    "secondValue": 2
  }
}

Örnekler

Gönderinin özeti boşsa, bunun yerine başlığı kullanın:

{
  posts {
    title
    originalExcerpt: excerpt
    isEmptyExcerpt: _isEmpty(value: $__originalExcerpt)
    excerpt: _if(condition: $__isEmptyExcerpt, then: $__title, else: $__originalExcerpt)
  }
}

Harici bir REST uç noktasından veri alın ve gereksinimlerinize uyacak şekilde işleyin.

{
  externalData: _sendJSONObjectItemHTTPRequest(input: { url: "https://example.com/rest/some-external-endpoint"} )
  userName: _objectProperty(object: $__externalData, by: { path: "data.user.name" })
  userLastName: _objectProperty(object: $__externalData, by: { path: "data.user.surname" })
}

Bu şunu üretecektir:

{
  "data": {
    "externalData": {
      "data": {
        "user": {
          "id": 1,
          "name": "Leo",
          "surname": "Loso"
        }
      }
    },
    "userName": "Leo",
    "userLastName": "Loso"
  }
}

externalData üzerinde @remove direktifini kullanarak yanıtta harici uç nokta kaynak verilerinin yazdırılmasını da önleyebiliriz:

{
  externalData: _sendJSONObjectItemHTTPRequest(input: { url: "https://example.com/rest/some-external-endpoint" } ) @remove
  userName: _objectProperty(object: $__externalData, by: { path: "data.user.name" })
  userLastName: _objectProperty(object: $__externalData, by: { path: "data.user.surname" })
}

Bu artık şunu üretecektir:

{
  "data": {
    "userName": "Leo",
    "userLastName": "Loso"
  }
}

Her kullanıcının e-postasından söz eden gönderileri her kullanıcı için alın:

{
  users {
    email
    posts(filter: { search: $__email }) {
      id
      title
    }
  }
}

optionValue alanı aracılığıyla to ve from e-postalarını tanımlayarak bir bülten gönderin:

mutation {
  fromEmail: optionValue(name: "admin_email")
  toEmail: optionValue(name: "subscribers_email_list_recipient_address")
  _sendEmail(
    from: {
      email: $__fromEmail
    }
    to: $__toEmail
    subject: "Weekly summary"
    messageAs: {
      html: "..."
    }
  )
}

Alan değerine göre koşullu işlemler gerçekleştirin. Bu query'de, "Leo" ve "Peter" kullanıcıları "özel kullanıcı" dizisinde yer aldığından adları büyük harfe dönüştürülürken "Martin" için bu işlem uygulanmaz:

query {
  users {
    name
      @passOnwards(as: "userName")
      @applyField(
        name: "_inArray"
        arguments: {
          value: $userName
          array: ["Leo", "John", "Peter"]
        }
        passOnwardsAs: "isSpecialUser"
      )
      @if(
        condition: $isSpecialUser
      )
        @strUpperCase
  }
}

...şunu üretir:

{
  "data": {
    "users": [
      {
        "name": "LEO"
      },
      {
        "name": "Martin"
      },
      {
        "name": "PETER"
      }
    ]
  }
}