【问题标题】:clean way to get same field by different key通过不同键获取相同字段的干净方法
【发布时间】:2018-07-12 18:35:05
【问题描述】:

这就是问题所在。我可以通过 ID 获取成员,我的查询如下所示:

{
  member(memberId:[1,2]) {
    firstName
    lastName
    contacts {
    }
  }
}

现在我需要添加更多查询以通过nameemail 获取成员,如下所示

   {
      member(email:["abc@xy.com","adc@xy.com"]) {
        firstName
        lastName
        contacts {
        }
      }
    }

   {
      member(name:["abc","adc"]) {
        firstName
        lastName
        contacts {
        }
      }
    }

如何设计我的 graphQL 查询和架构?我的查询是否应该只有 1 个带有多个可选参数的字段?如下所示

Field("member", ListType(Member),
        arguments = ids :: email :: name,
        resolve = (ctx) => {
          val id : Seq[Int] = ctx.arg("memberId")
          ctx.ctx.getMemberDetails(id)
        })

或者我应该在一个模式下有多个不同字段的查询。如下所示

  Field("memberById", ListType(Member),
    arguments = Id :: Nil,
    resolve = (ctx) => {
      val id : Seq[Int] = ctx.arg("memberId")
      ctx.ctx.getMemberDetails(id)
    })
  Field("memberByEmail", ListType(Member),
    arguments = email :: Nil,
    resolve = (ctx) => {
      val id : Seq[Int] = ctx.arg("memberId")
      ctx.ctx.getMemberDetails(id)
    })
  Field("memberByName", ListType(Member),
    arguments = name :: Nil,
    resolve = (ctx) => {
      val id : Seq[Int] = ctx.arg("memberId")
      ctx.ctx.getMemberDetails(id)
    })

提前谢谢你。如果您需要更多详细信息,请告诉我。

【问题讨论】:

    标签: graphql sangria


    【解决方案1】:

    您应该考虑这两种解决方案的优缺点。 如果你准备单独的字段,你会得到很多样板。

    另一方面,您可以将所有可能的输入设置为OptionalInputType,它只生成架构字段。这种解决方案的缺点是 Sangria 无法验证至少需要一个参数的字段,因此您必须通过适当的响应或其他方式来涵盖这种情况。

    第三个选项是在架构级别制作通用解决方案。您可以创建一个带有两个参数filterNamefilterValues 的查询,第一个是EnumType 对应IdEmailName,第二个是字符串列表。

    这种解决方案避免了以前两种解决方案的缺点,它具有必填字段,并且不需要在架构中为每个过滤器扩展字段。此外,如果您想添加任何其他功能,您只需编辑 FilterName 枚举和解析器功能即可。

    最后你的架构将如下所示:

    enum FilterName {
      ID
      EMAIL
      NAME
    }
    
    type Query {
      member(filterName: FilterName!, filterValues: [String]!): Member!
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 2012-06-21
      • 2021-01-23
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多