Schema Functions
Schema FunctionsPHP Functions via Schema

PHP Functions via Schema

Included in the “Power Extensions” bundle

この拡張機能は、プログラミング言語(PHPなど)に一般的に存在する機能を公開するフィールドとディレクティブをGraphQLスキーマに追加します。

説明

関数フィールドとディレクティブは、データを取得した後に操作するために役立ちます。必要に応じてフィールドの値を変換し、強力なデータのインポート・エクスポート機能を提供します。

さまざまな関数フィールドとディレクティブを含む以下のクエリは:

{
  _intAdd(add: 15, to: 56)
  _intArraySum(array: [1, 2, 3, 4, 5])
 
  _arrayJoin(array: ["Hello", "to", "everyone"], separator: " ")
  _arrayItem(array: ["one", "two", "three", "four", "five"], position: 3)
  _arraySearch(array: ["uno", "dos", "tres", "cuatro", "cinco"], element: "tres")
  _arrayUnique(array: ["uno", "dos", "uno", "tres", "cuatro", "dos", "cinco", "dos"])
  _arrayMerge(arrays: [["uno", "dos", "uno"], ["tres", "cuatro", "dos", "cinco", "dos"]])
  _arrayDiff(arrays: [["uno", "dos"], ["tres", "cuatro", "dos"]])
  _arrayAddItem(array: ["uno", "dos"], value: "tres")
  _arraySetItem(array: ["uno", "dos"], index: 0, value: "tres")
  _arrayKeys(array: ["uno", "dos", "tres"])
  _arrayLength(array: ["uno", "dos", "tres"])
 
  _strRegexFindMatches(regex: "/https?:\\/\\/([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\\.[a-zA-Z]{2,})/", string: "In website https://gatographql.com there is more information")
  
  _strReplace(search: "https://", replaceWith: "http://", in: "https://gatographql.com")
  _strReplaceMultiple(search: ["https://", "gato"], replaceWith: ["http://", "dog"], in: "https://gatographql.com")
  _strRegexReplace(searchRegex: "/^https?:\\/\\//", replaceWith: "", in: "https://gatographql.com")
  _strRegexReplaceMultiple(searchRegex: ["/^https?:\\/\\//", "/([a-z]*)/"], replaceWith: ["", "$1$1"], in: "https://gatographql.com")
  
  _strStartsWith(search: "orld", in: "Hello world")
  _strEndsWith(search: "orld", in: "Hello world")
  _strUpperCase(text: "Hello world")
  _strLowerCase(text: "Hello world")
  _strTitleCase(text: "Hello world")
 
 
  falseToTrue: _echo(value: false) @boolOpposite
  trueToFalse: _echo(value: true) @boolOpposite
  plusOne: _echo(value: 2) @intAdd(number: 1)
  objectAddEntry: _echo(value: {
    user: "Leo",
    contact: {
      email: "leo@test.com"
    }
  })
    @objectAddEntry(key: "phone", value: "+0929094229", underPath: "contact")
    @objectAddEntry(key: "methods", value: {}, underPath: "contact")
    @objectAddEntry(key: "card", value: true, underPath: "contact.methods")
  upperCase: _echo(value: "Hello world") @strUpperCase
  lowerCase: _echo(value: "Hello world") @strLowerCase
  titleCase: _echo(value: "Hello world") @strTitleCase
  append: _echo(value: "Hello world") @strAppend(string: "!!!")
  prepend: _echo(value: "Hello world") @strPrepend(string: "!!!")
  arraySplice: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1)
  arraySpliceWithLength: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1, length: 1)
  arraySpliceWithReplacement: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1, replacement: ["cuatro", "cinco"])
  arraySpliceWithLengthAndReplacement: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1, length: 1, replacement: ["cuatro", "cinco"])
  arrayUnique: _echo(value: ["uno", "dos", "uno", "tres", "cuatro", "dos", "cinco", "dos"]) @arrayUnique
  arrayMerge: _echo(value: ["uno", "dos", "uno"]) @arrayMerge(with: ["tres", "cuatro", "dos", "cinco", "dos"])
  arrayDiff: _echo(value: ["uno", "dos"]) @arrayDiff (against: ["tres", "cuatro", "dos"])
  arrayFilter: _echo(value: ["uno", "dos", null, "tres", "", "dos", []]) @arrayFilter
  objectKeepProperties: _echo(value: { user: "Leo", email: "leo@test.com" } )
    @objectKeepProperties(
      keys: ["user"]
    )
}

...次の結果を生成します:

{
  "data": {
    "_intAdd": 71,
    "_intArraySum": 15,
    "_arrayJoin": "Hello to everyone",
    "_arrayItem": "four",
    "_arraySearch": 2,
    "_arrayUnique": [
      "uno",
      "dos",
      "tres",
      "cuatro",
      "cinco"
    ],
    "_arrayMerge": [
      "uno",
      "dos",
      "uno",
      "tres",
      "cuatro",
      "dos",
      "cinco",
      "dos"
    ],
    "_arrayDiff": [
      "uno"
    ],
    "_arrayAddItem": [
      "uno",
      "dos",
      "tres"
    ],
    "_arraySetItem": [
      "tres",
      "dos"
    ],
    "_arrayKeys": [
      0,
      1,
      2
    ],
    "_arrayLength": 3,
    "_strRegexFindMatches": [
      [
        "https:\/\/gatographql.com"
      ],
      [
        "gatographql.com"
      ]
    ],
    "_strReplace": "http://gatographql.com",
    "_strReplaceMultiple": "http://doggraphql.com",
    "_strRegexReplace": "gatographql.com",
    "_strRegexReplaceMultiple": "gatographqlgatographql.comcom",
    "_strStartsWith": false,
    "_strEndsWith": true,
    "_strUpperCase": "HELLO WORLD",
    "_strLowerCase": "hello world",
    "_strTitleCase": "Hello World",
    "falseToTrue": true,
    "trueToFalse": false,
    "plusOne": 3,
    "objectAddEntry": {
      "user": "Leo",
      "contact": {
        "email": "leo@test.com",
        "phone": "+0929094229",
        "methods": {
          "card": true
        }
      }
    },
    "upperCase": "HELLO WORLD",
    "lowerCase": "hello world",
    "titleCase": "Hello World",
    "append": "Hello world!!!",
    "prepend": "!!!Hello world",
    "arraySplice": [
      "uno"
    ],
    "arraySpliceWithLength": [
      "uno",
      "tres"
    ],
    "arraySpliceWithReplacement": [
      "uno",
      "cuatro",
      "cinco"
    ],
    "arraySpliceWithLengthAndReplacement": [
      "uno",
      "cuatro",
      "cinco",
      "tres"
    ],
    "arrayUnique": [
      "uno",
      "dos",
      "tres",
      "cuatro",
      "cinco"
    ],
    "arrayMerge": [
      "uno",
      "dos",
      "uno",
      "tres",
      "cuatro",
      "dos",
      "cinco",
      "dos"
    ],
    "arrayDiff": [
      "uno"
    ],
    "arrayFilter": [
      "uno",
      "dos",
      "tres",
      "dos"
    ],
    "objectKeepProperties": {
      "user": "Leo"
    }
  }
}

関数フィールド

関数フィールドはグローバルフィールドであるため、GraphQLスキーマのすべての型に追加されます。QueryRootだけでなく、PostUserなどにも追加されます。

以下は関数フィールドの一覧です。

_and

複数のブール型プロパティのAND演算を返します。

_arrayAddItem

配列に要素を追加します。

_arrayCombine

配列の要素をキーとして、別の配列の要素を値として使用してJSONオブジェクトを作成します。

_arrayChunk

配列をチャンクに分割します。

_arrayDiff

最初の配列に存在し、他のいずれの配列にも存在しない要素をすべて含む配列を返します。

_arrayEncodeAsJSONString

配列をJSON文字列としてエンコードします。

_arrayFill

値で満たされた配列を作成します。

_arrayFilter

配列内のnullまたは空の要素を除外します。

_arrayFlipToObject

配列内のすべての数値キーとそれに関連する値を交換し、オブジェクトを返します。

_arrayInnerJoinJSONObjectProperties

ターゲット配列内のJSONオブジェクトを、ソース配列のJSONオブジェクトのプロパティで補完します。両オブジェクトで特定のプロパティが同じ場合に適用されます。

_arrayItem

配列の指定した位置にある要素にアクセスします。

_arrayJoin

指定したセパレーターを使用して、配列内のすべての文字列を結合します。

_arrayKeys

配列のキーを返します。

_arrayLength

配列内の要素数を返します。

_arrayMerge

2つ以上の配列をまとめてマージします。

_arrayPad

値を使用して配列を指定の長さまで埋めます。

_arrayRandom

提供された要素の中からランダムに1つを選択します。

_arrayRemoveFirst

配列の最初の要素を削除します。

_arrayRemoveLast

配列の最後の要素を削除します。

_arrayReverse

配列を逆順にします。

_arraySearch

配列内で要素が置かれている位置を検索します。見つかった場合はその位置を返し、見つからない場合はfalseを返します。

_arraySetItem

配列の指定した位置に要素を設定します。

_arraySlice

配列の一部を切り出します。

_arraySplice

配列の一部を削除し、別のものに置き換えます。

_arrayUnique

配列内の重複した要素をすべて除外します。

_date

指定したフォーマット文字列に従い、指定した整数のtimestamp(Unixタイムスタンプ)を使用するか、タイムスタンプが指定されていない場合は現在時刻を使用して、フォーマットされた文字列を返します。つまり、timestampはオプションであり、デフォルトはtime()の値(フィールド_timeを通じて提供)です。

_echo

入力をそのまま返します。

_equals

フィールドの結果が特定の値と等しいかどうかを示します。

_floatCeil

数値を次に高い整数に切り上げます。

_floatDivide

ある数を別の数で割ります。

_greaterThan

number1 > number2かどうかを示します。

_greaterThanOrEquals

number1 >= number2かどうかを示します。

_if

ブール型プロパティがtrueの場合はあるフィールドを実行し、そうでない場合は別のフィールドを実行します。

_inArray

配列が値を含むかどうかを示します。

_intAdd

整数に別の整数を加算します。

_intArraySum

配列内の整数要素の合計を返します。

_intMultiply

整数に別の整数を掛け合わせます。

_intSubtract

ある整数から別の整数を減算します。

_isEmpty

値が空かどうかを示します。

_isNull

値がnullかどうかを示します。

_lowerThan

number1 < number2かどうかを示します。

_lowerThanOrEquals

number1 <= number2かどうかを示します。

_makeTime

指定した引数に対応するUnixタイムスタンプを返します。このタイムスタンプは、Unixエポック(1970年1月1日00:00:00 GMT)から指定した時刻までの秒数を含む長整数です。

省略またはnullにしたオプション引数は、ローカルの日付と時刻に従って現在の値に設定されます。

_not

ブール型プロパティの逆の値を返します。

_notEmpty

値が空でないかどうかを示します。

_notEquals

2つの値が互いに等しくないかどうかを示します。

_notInArray

配列が値を含まないかどうかを示します。

_notNull

値がnullでないかどうかを示します。

_objectAddEntry

オブジェクトにエントリを追加します。

_objectEncodeAsJSONString

オブジェクトをJSON文字列としてエンコードします。

_objectFilter

オブジェクト内のnullまたは空の要素を除外します。

_objectFlip

JSONオブジェクト内のキーと値を反転します。

_objectIntersectKey

比較にキーを使用してオブジェクトの共通部分を計算します。

_objectKeepProperties

JSONオブジェクト内の特定のプロパティのみを保持します。

_objectMerge

2つ以上のオブジェクトをまとめてマージします。

_objectProperties

JSONオブジェクト内のプロパティを取得します。

_objectProperty

JSONオブジェクトからプロパティを取得します。

_objectRemoveEntry

JSONオブジェクトからエントリを削除します。

_objectRemoveProperties

JSONオブジェクトから1つ以上のエントリを削除します。

_objectValues

JSONオブジェクト内の値を取得します。

_or

複数のブール型プロパティのOR演算を返します。

_propertyExistsInJSONObject

JSONオブジェクト上にプロパティが存在するかどうかを示します。

_propertyIsSetInJSONObject

JSONオブジェクト上にプロパティが存在し、かつnullでないかどうかを示します。

_sprintf

文字列内のプレースホルダーを指定した値に置き換えます。

_strAppend

別の文字列の末尾に文字列を追加します。

_strArrayReplace

配列内の文字列を別の文字列に置き換えます。

_strArrayReplaceMultiple

配列内の文字列のリストを別の文字列のリストに置き換えます。

_strContains

文字列が別の文字列を含むかどうかを示します。

_strDecodeJSONObject

文字列をJSONオブジェクトにデコードします。不可能な場合はnullを返します。

_strDecodeList

文字列を配列(任意の型)にデコードします。不可能な場合はnullを返します。

_strEndsWith

文字列が別の文字列で終わるかどうかを示します。

_strLength

文字列の長さを返します。

_strLowerCase

文字列を小文字に変換します。

_strPad

別の文字列を使用して文字列を指定の長さまで埋めます。

_strPos

文字列内の部分文字列の位置を返します。見つからない場合はnullを返します。

_strRegexFindMatches

正規表現を実行して文字列からすべての一致を抽出します。

_strRegexReplace

正規表現を実行して文字列を検索・置換します。

_strRegexReplaceMultiple

正規表現を実行して文字列を検索・置換します。

_strRepeat

文字列を繰り返します。

_strReplace

文字列を別の文字列に置き換えます。

_strReplaceMultiple

文字列のリストを別の文字列のリストに置き換えます。

_strReverse

文字列を逆順にします。

_strShuffle

文字列をランダムにシャッフルします。

_strStartsWith

文字列が別の文字列で始まるかどうかを示します。

_strStripSlashes

バックスラッシュが取り除かれた文字列を返します。(\' は ' になります。以下同様。) 二重バックスラッシュ (\\) は単一のバックスラッシュ (\) になります。

_strSubstr

文字列の一部を返します。

_strTitleCase

文字列をタイトルケースに変換します。

_strToTime

英語のテキスト形式の日時の説明をUnixタイムスタンプに変換します。

_strTrim

文字列の先頭と末尾から空白(またはその他の文字)を取り除きます。

_strUpperCase

文字列を大文字に変換します。

_strWordCount

文字列内の単語数を返します。

_time

現在時刻を返します。

関数ディレクティブ

以下は関数ディレクティブの一覧です。

@arrayAddItem

配列に要素を追加します。

@arrayDiff

別の配列との差分を計算します。

@arrayFilter

配列内のnullまたは空の要素を除外します。

@arrayMerge

配列を別の配列とマージします。

@arrayPad

値を使用して配列を指定の長さまで埋めます。

@arrayRemoveFirst

配列の最初の要素を削除します。

@arrayRemoveLast

配列の最後の要素を削除します。

@arrayReverse

配列を逆順にします。

@arraySetItem

配列の指定した位置に要素を設定します。

@arraySlice

配列の一部を切り出します。

@arraySplice

配列の一部を削除し、別のものに置き換えます。

@arrayUnique

配列内の重複した要素をすべて除外します。

@boolOpposite

ブール値を逆の値に変換します。

@floatDivide

フィールドの値をfloat数で割ります。

@intAdd

フィールドの値に整数を加算します。

@intMultiply

フィールドの値に整数を掛け合わせます。

@intSubtract

フィールドの値から整数を減算します。

@objectAddEntry

JSONオブジェクトにエントリを追加します。

@objectFilter

オブジェクト内のnullまたは空の要素を除外します。

@objectKeepProperties

JSONオブジェクトから特定のプロパティのみを保持します。

@objectRemoveEntry

JSONオブジェクトからエントリを削除します。

@objectRemoveProperties

JSONオブジェクトから特定のプロパティを削除します。

@setNull

フィールドの値をnullに設定します。

@strAppend

フィールドの値の文字列の末尾に文字列を追加します。

@strLowerCase

文字列を小文字に変換します。

@strPad

別の文字列を使用して文字列を指定の長さまで埋めます。

@strPrepend

フィールドの値の文字列の先頭に文字列を追加します。

@strRegexReplace

正規表現を実行して文字列を検索・置換します(PHP関数preg_replaceのドキュメントを参照)。

@strRegexReplaceMultiple

正規表現を実行して文字列のリストを検索・置換します(PHP関数preg_replaceのドキュメントを参照)。

@strRepeat

文字列を繰り返します。

@strReplace

文字列を別の文字列に置き換えます。

@strReplaceMultiple

文字列のリストを別の文字列のリストに置き換えます。

@strReverse

文字列を逆順にします。

@strShuffle

文字列をランダムにシャッフルします。

@strStripSlashes

バックスラッシュが取り除かれた文字列を返します。(\' は ' になります。以下同様。) 二重バックスラッシュ (\\) は単一のバックスラッシュになります。

@strSubstr

文字列の一部を返します。

@strTitleCase

文字列をタイトルケースに変換します。

@strTrim

文字列の先頭と末尾から空白(またはその他の文字)を取り除きます。

@strUpperCase

文字列を大文字に変換します。

関数フィールド

Post.hasCommentsフィールドがある場合でも、逆の値が必要になることがあります。新しいフィールドPost.notHasCommentsを作成する(PHPコードを編集する必要がある)代わりに、Field to Input機能を使用してhasCommentsの値をnotフィールドに入力し、GraphQLクエリ内で常に新しい値を計算することができます:

{
  posts {
    id
    hasComments
    notHasComments: _not(value: $__hasComments)
  }
}

関数フィールドを複数回適用して、より複雑な計算を実行することができます。例えば、他のフィールドの値に基づいてsummaryフィールドを生成する場合:

{
  posts {
    id
    content @remove
    shortContent: _strSubstr(string: $__content, offset: 0, length: 150) @remove
    excerpt @remove
    isExcerptEmpty: _isEmpty(value: $__excerpt) @remove
    summary: _if(
      condition: $__isExcerptEmpty
      then: $__content
      else: $__excerpt
    )
  }
}

HTTP Client拡張機能と組み合わせることで、(サイトのデータに基づいて)接続するAPIエンドポイントを動的に生成し、返されたデータから特定のフィールドを抽出することができます:

{
  users(
    pagination: { limit: 2 },
    sort: { order: ASC, by: ID }
  ) {
    id
    
    # Dynamically generate endpoint for the user
    endpoint: _arrayJoin(values: [
      "https://newapi.getpop.org/wp-json/wp/v2/users/",
      $__id,
      "?_fields=name,avatar_urls"
    ])
    
    # Retrieve the endpoint data
    endpointData: _sendJSONObjectItemHTTPRequest(input: { url: $__endpoint } )
 
    # Extract specific information
    userAvatar: _objectProperty(
      object: $__endpointData,
      by: {
        path: "avatar_urls.48"
      }
    )
  }
}

...次の結果を生成します:

{
  "data": {
    "users": [
      {
        "id": 1,
        "endpoint": "https://newapi.getpop.org/wp-json/wp/v2/users/1?_fields=name,avatar_urls",
        "endpointData": {
          "name": "leo",
          "avatar_urls": {
            "24": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=24&d=mm&r=g",
            "48": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=48&d=mm&r=g",
            "96": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g"
          },
          "_links": {
            "self": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users/1"
              }
            ],
            "collection": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users"
              }
            ]
          }
        },
        "userAvatar": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=48&d=mm&r=g"
      },
      {
        "id": 2,
        "endpoint": "https://newapi.getpop.org/wp-json/wp/v2/users/2?_fields=name,avatar_urls",
        "endpointData": {
          "name": "themedemos",
          "avatar_urls": {
            "24": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=24&d=mm&r=g",
            "48": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=48&d=mm&r=g",
            "96": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=96&d=mm&r=g"
          },
          "_links": {
            "self": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users/2"
              }
            ],
            "collection": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users"
              }
            ]
          }
        },
        "userAvatar": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=48&d=mm&r=g"
      }
    ]
  }
}

関数ディレクティブ

以下のクエリが:

query {
  posts {
    title
  }
}

...次の結果を生成する場合:

{
  "data": {
    "posts": [
      {
        "title": "Hello world!"
      },
      {
        "title": "lovely weather"
      }
    ]
  }
}

...次のクエリは:

query {
  posts {
    title @strUpperCase
  }
}

...次の結果を生成します:

{
  "data": {
    "posts": [
      {
        "title": "HELLO WORLD!"
      },
      {
        "title": "LOVELY WEATHER"
      }
    ]
  }
}