通过不同的键获得相同字段的干净方法
clean way to get same field by different key
问题来了。我可以通过 ID 获取会员,我的查询如下所示:
{
member(memberId:[1,2]) {
firstName
lastName
contacts {
}
}
}
现在我需要添加更多查询以通过 name
和 email
获取成员,如下所示
{
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)
})
提前谢谢你。如果您需要更多详细信息,请告诉我。
您应该考虑这两种解决方案的优缺点。
如果你准备单独的字段,你会得到很多样板文件。
另一方面,您可以将所有可能的输入设置为 OptionalInputType
,它只生成架构字段。此解决方案的缺点是 Sangria 无法验证至少需要一个参数的字段,因此您必须通过适当的响应或其他方式来涵盖这种情况。
第三种选择是在架构级别制定通用解决方案。您可以使用两个参数 filterName
和 filterValues
创建查询,第一个参数是 EnumType
for Id
、Email
、Name
,第二个参数是是一个字符串列表。
这样的解决方案避免了之前两种解决方案的缺点,它有必填字段,并且不需要在每个过滤器的模式中展开字段。此外,如果您想添加任何其他功能,您只需编辑 FilterName
枚举和一个解析器功能即可。
最终您的架构将如下所示:
enum FilterName {
ID
EMAIL
NAME
}
type Query {
member(filterName: FilterName!, filterValues: [String]!): Member!
}
问题来了。我可以通过 ID 获取会员,我的查询如下所示:
{
member(memberId:[1,2]) {
firstName
lastName
contacts {
}
}
}
现在我需要添加更多查询以通过 name
和 email
获取成员,如下所示
{
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)
})
提前谢谢你。如果您需要更多详细信息,请告诉我。
您应该考虑这两种解决方案的优缺点。 如果你准备单独的字段,你会得到很多样板文件。
另一方面,您可以将所有可能的输入设置为 OptionalInputType
,它只生成架构字段。此解决方案的缺点是 Sangria 无法验证至少需要一个参数的字段,因此您必须通过适当的响应或其他方式来涵盖这种情况。
第三种选择是在架构级别制定通用解决方案。您可以使用两个参数 filterName
和 filterValues
创建查询,第一个参数是 EnumType
for Id
、Email
、Name
,第二个参数是是一个字符串列表。
这样的解决方案避免了之前两种解决方案的缺点,它有必填字段,并且不需要在每个过滤器的模式中展开字段。此外,如果您想添加任何其他功能,您只需编辑 FilterName
枚举和一个解析器功能即可。
最终您的架构将如下所示:
enum FilterName {
ID
EMAIL
NAME
}
type Query {
member(filterName: FilterName!, filterValues: [String]!): Member!
}