首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gorm / graphql中的跳过预加载

问gorm / graphql中的跳过预加载
EN

Stack Overflow用户
提问于 2022-11-30 16:42:04
回答 1查看 37关注 0票数 1

我目前正在传递一些教程,介绍如何使用gqlgen和gorm (mysql服务器)创建Graphql服务器。

这是我的密码

代码语言:javascript
复制
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时,如下所示:

代码语言:javascript
复制
query{
    teams {
        id
        nat3
    }
}

上面我不请求players,但是预加载是执行的,这会在mysql服务器上产生不必要的负载。

EN

回答 1

Stack Overflow用户

发布于 2022-12-01 09:38:13

您需要一个额外的players解析器。这是GraphQL的一个一般概念,而不是具体的Go和gqlgen。

在gqlgen中,您可以为gqlgen.yml文件中的特定字段指定一个解析器。您应该在那里有一个models属性。如果您还没有它,您可以添加它。

代码语言:javascript
复制
# 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生成一个解析器类型,如下所示:

代码语言:javascript
复制
func (r *resolver) Team() schema.TeamResolver {
    return &teamResolver{r}
}

type teamResolver struct {
    *resolver // this should be the gqlgen root resolver
}

及其Players解析器,如下所示:

代码语言:javascript
复制
func (r *teamResolver) Players(ctx context.Context, obj *model.Team) ([]*model.Player, error) {
    // fetch players here
}

现在,如果客户端请求不包括players,则此解析器将无法运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74631264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档