Query Functions
Query Functions字段上的字段

字段上的字段

Included in the “Power Extensions” bundle

@applyField 指令,用于在已解析字段的值上执行特定字段。

描述

应用于某个字段时,@applyField 指令可以执行另一个字段(该字段在同一类型上可用,并应用于同一对象),并将结果值传递给另一个指令,或覆盖该字段的值。

这使我们能够通过 PHP Functions via Schema 扩展提供的功能,以多种方式操作字段的值,并将新结果存储到响应中。

在以下 query 中,对象的 Post.title 字段值为 "Hello world!"。通过添加 @applyField 来执行 _strUpperCase 字段(并在其前面加上 @passOnwards,将字段值导出为动态的 $input):

{
  post(by: { id: 1 }) {
    title
      @passOnwards(as: "input")
      @applyField(
        name: "_strUpperCase"
        arguments: {
          text: $input
        },
        setResultInResponse: true
      )
  }
}

...字段值被转换为大写,生成:

{
  "data": {
    "post": {
      "title": "HELLO WORLD!"
    }
  }
}

我们可以连接多个 @applyFunction,将一个的响应作为另一个的输入,从而对同一字段值执行多个操作。

在以下 query 中,应用了 2 个 @applyFunction 操作:

  1. 转换为大写,并将值作为 $ucTitle 传递给下一步
  2. " " 替换为 "-" 并覆盖字段值
{
  post(by: { id: 1 }) {
    title
      @passOnwards(as: "input")
      @applyField(
        name: "_strUpperCase"
        arguments: {
          text: $input
        },
        passOnwardsAs: "ucTitle"
      )
      @applyField(
        name: "_strReplace"
        arguments: {
          search: " ",
          replaceWith: "-",
          in: $ucTitle
        },
        setResultInResponse: true
      )
  }
}

...生成:

{
  "data": {
    "post": {
      "title": "HELLO-WORLD!"
    }
  }
}

更多示例

获取字段提供值的相反值:

{
  posts {
    id
    notHasComments: hasComments
      @passOnwards(as: "hasComments")
      @applyField(
        name: "_not",
        arguments: {
          value: $hasComments
        },
        setResultInResponse: true
      )
  }
}

结合 Data Iteration Meta Directives 扩展,操作数组中的所有项目,将每项缩短至最多 20 个字符:

{
  posts {
    categoryNames
      @underEachArrayItem(passValueOnwardsAs: "categoryName")
        @applyField(
          name: "_strSubstr"
          arguments: {
            string: $categoryName,
            offset: 0,
            length: 20
          },
          setResultInResponse: true
        )
  }
}

结合 Data Iteration Meta Directives 扩展,将数组的第一项转换为大写:

{
  posts {
    categoryNames
      @underArrayItem(passOnwardsAs: "value", index: 0)
        @applyField(
          name: "_strUpperCase"
          arguments: {
            text: $value
          },
          setResultInResponse: true
        )
  }
}