用不同的键获得相同字段的干净方法

时间:2018-07-12 09:08:55

标签: graphql sangria

这是问题所在。我可以通过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查询和模式?我的查询应该只有一个带有多个可选参数的字段吗?像下面一样

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)
    })

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

1 个答案:

答案 0 :(得分:1)

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

另一方面,您可以将所有可能的输入设置为OptionalInputType,这仅使模式字段成为可能。这种解决方案的缺点是,桑格利亚汽酒厂无法验证一个字段,至少需要一个参数,因此您必须以适当的响应或其他方式来解决此问题。

第三个选项是在Schema级别制定通用解决方案。您可以使用两个参数filterNamefilterValues创建查询,第一个参数是EnumTypeIdEmail的{​​{1}},第二个参数是是字符串列表。

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

最后,您的架构将如下所示:

FilterName