我目前正在传递一些教程,介绍如何使用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的预加载,当graphql客户端不请求players时,如下所示:
query{
teams {
id
nat3
}
}上面我不请求players,但是预加载是执行的,这会在mysql服务器上产生不必要的负载。
发布于 2022-12-01 09:38:13
您需要一个额外的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然后,如果您遵循gqlgen项目设置,则使用go run github.com/99designs/gqlgen重新生成Go代码,或者只使用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,则此解析器将无法运行。
https://stackoverflow.com/questions/74631264
复制相似问题