Resolver 是对 Graphql 进行困难查询的最佳实践?
Resolver is the best practice for difficult query to Graphql?
我正在通过 Laravel 学习 GraphQL。
当我需要从困难的查询中响应时(包括子查询或分组依据)
我可以用解析器做到这一点。
例如
select * from A where id in (select id from B where name='~~')
但我想知道这是响应的最佳方式(最佳实践)。
谁能给我答案?
我的最佳做法是从数据库表的角度进行思考,并将思考重点放在领域模型上。
所以领域模型对象图应该有两种类型 A 和 B,并且它们应该通过字段以某种方式相互关联。
假设A是一支足球队,B是一名球员。所以基本上,你想在这个 SQL:
中做什么
select * from A where id in (select a_id from B where name='~~')
就是从领域模型的角度,找出所有包含名字叫blablabla的球员的足球队信息。
所以也许我们可以有两种类型 Team
和 Player
:
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
}
并将此过滤器应用于团队 query.It 然后变为:
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%')
我正在通过 Laravel 学习 GraphQL。 当我需要从困难的查询中响应时(包括子查询或分组依据) 我可以用解析器做到这一点。
例如
select * from A where id in (select id from B where name='~~')
但我想知道这是响应的最佳方式(最佳实践)。 谁能给我答案?
我的最佳做法是从数据库表的角度进行思考,并将思考重点放在领域模型上。
所以领域模型对象图应该有两种类型 A 和 B,并且它们应该通过字段以某种方式相互关联。
假设A是一支足球队,B是一名球员。所以基本上,你想在这个 SQL:
中做什么select * from A where id in (select a_id from B where name='~~')
就是从领域模型的角度,找出所有包含名字叫blablabla的球员的足球队信息。
所以也许我们可以有两种类型 Team
和 Player
:
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
}
并将此过滤器应用于团队 query.It 然后变为:
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%')