跳过在gorm / graphql中的预加载



我目前正在传递一些关于使用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,这个解析器将不会运行。

相关内容

  • 没有找到相关文章

最新更新