PHP Functions via Schema
この拡張機能は、プログラミング言語(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だけでなく、Post、Userなどにも追加されます。
以下は関数フィールドの一覧です。
_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"
}
]
}
}