解析器是对Graphql进行困难查询的最佳实践?

时间:2019-09-05 03:33:35

标签: laravel graphql resolver

我正在使用Laravel学习GraphQL。 当我需要响应困难的查询(包括子查询或分组依据)时 我可以使用解析器来做到这一点。

例如。

  

从A的id中选择*(从B的name ='~~'中选择ID)

但是我不知道这是回应的最佳方法(最佳实践)。 谁能给我答案?

1 个答案:

答案 0 :(得分:1)

我的最佳实践是从数据库表的角度进行思考,并将思考重点放在域模型上。

因此,领域模型对象图应具有两种类型A和B,并且它们应通过字段以某种方式彼此关联。

假设A是一支足球队,B是一名球员。因此,基本上,您想要在此SQL中做什么:

select * from A where id in (select a_id from B where name='~~')

从域模型的角度查找所有包含某个名字叫blablabla的球员的足球队信息。

所以也许我们可以有两种类型,分别称为TeamPlayer

type Team {
    id      : Int!
    name    : String
    address : String
    players : [Player]
}
type Player {
    id    : Int!    
    name  : String
    age   : Int
    team  : Team
}

要获取所有足球队的数据,我们需要有一个根查询:

extend type Query {
   teams : [Team]
}

由于我们需要根据某些条件来过滤返回的团队,因此我们可以设计一个输入对象来表示这样的过滤器:

input TeamFilter {
  includePlayerName : String
}

将此过滤器应用于团队查询,然后变为:

extend type Query {
   teams (filter: TeamFilter) : [Team]
}

现在,我们可以创建一个查询来定义我们想要检索的内容。例如:

query {
    teams(filter : {
      includePlayerName : "*Peter*"  
    }){
       id 
       name
    }
}

等同于SQL:

  select id, name from Team where id in (select team_id from Player where name likes '%Perter%')