Graphql 通过不同的键获得相同字段的干净方法
问题就在这里。我可以通过ID获取成员,我的查询如下所示:Graphql 通过不同的键获得相同字段的干净方法,graphql,sangria,Graphql,Sangria,问题就在这里。我可以通过ID获取成员,我的查询如下所示: { member(memberId:[1,2]) { firstName lastName contacts { } } } 现在,我需要添加一些查询,通过名称和电子邮件获取成员,如下所示 { member(email:["abc@xy.com","adc@xy.com"]) { firstName lastName contact
{
member(memberId:[1,2]) {
firstName
lastName
contacts {
}
}
}
现在,我需要添加一些查询,通过名称
和电子邮件
获取成员,如下所示
{
member(email:["abc@xy.com","adc@xy.com"]) {
firstName
lastName
contacts {
}
}
}
{
member(name:["abc","adc"]) {
firstName
lastName
contacts {
}
}
}
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查询和模式?我的查询应该只有一个字段和多个可选参数吗?如下
{
member(email:["abc@xy.com","adc@xy.com"]) {
firstName
lastName
contacts {
}
}
}
{
member(name:["abc","adc"]) {
firstName
lastName
contacts {
}
}
}
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)
})
或者我应该在一个模式下有多个具有不同字段的查询。如下
{
member(email:["abc@xy.com","adc@xy.com"]) {
firstName
lastName
contacts {
}
}
}
{
member(name:["abc","adc"]) {
firstName
lastName
contacts {
}
}
}
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
,第一个参数为Id
,Email
,Name
,第二个参数为字符串列表
这种解决方案避免了以前两种解决方案的缺点,它具有必填字段,并且不需要在模式中为每个过滤器扩展字段。此外,如果要添加任何附加函数,您只有编辑FilterName
enum和一个解析器函数来解决此问题
最后,您的架构将如下所示:
enum FilterName {
ID
EMAIL
NAME
}
type Query {
member(filterName: FilterName!, filterValues: [String]!): Member!
}