我目前正在传递一些关于使用gqlgen和gorm (mysql服务器)创建Graphql服务器的教程。
我的代码
type Player struct {
ID string `json:"id"`
Name string `json:"name"`
TeamID int `json:"team_id"`
}
type Team struct {
ID string `json:"id"`
Nat3 string `json:"nat3"`
Players []*Player `json:"players"`
}
...
func (r *queryResolver) Teams(ctx context.Context) ([]*model.Team, error) {
var teams []*model.Team
r.DB.Preload("Players").Find(&teams)
return teams, nil
}
所以通过请求"有球员的球队";它工作得很好。然而,我想知道是否有一种方法可以跳过Players
的预加载,当players
不是由graphql客户端请求时,像这样:
query{
teams {
id
nat3
}
}
上面我没有请求players
,但是预加载被执行,这会对mysql服务器产生不必要的负载。
您需要为players
添加一个解析器。这是GraphQL的一般概念,而不是Go和gqlgen。
在gqlgen中,您可以为gqlgen.yml
文件中的特定字段指定解析器。你应该有一个models
属性。如果你还没有,你可以添加它。
# top-level property
models:
# name of your Go type
Team:
# fields, don't change this
fields:
# name of the field for which you want a resolver
players:
resolver: true
然后使用go run github.com/99designs/gqlgen
重新生成Go代码,如果您遵循gqlgen项目设置,则仅使用go generate
。
现在应该在某处为Team
生成一个解析器类型,如下所示:
func (r *resolver) Team() schema.TeamResolver {
return &teamResolver{r}
}
type teamResolver struct {
*resolver // this should be the gqlgen root resolver
}
及其Players
解析器,如下所示:
func (r *teamResolver) Players(ctx context.Context, obj *model.Team) ([]*model.Player, error) {
// fetch players here
}
现在如果客户端请求不包含players
,这个解析器将不会运行。