【问题标题】:How to resolve a Graphql Union with Gorm?如何使用 Gorm 解决 Graphql 联合?
【发布时间】:2022-02-08 04:15:49
【问题描述】:

我有两个具体类型 ProdottoProdottoVariante 的联合,它们都实现了 Articolo 类型的接口。

union Articoli = Prodotto | ProdottoVariante

extend type Query {
  articoli: [Articoli!]!
}

我想通过输入 articoli 查询所有 Prodotto 和所有 ProdottoVariante,但我不知道如何解决 Articoli

我正在尝试这种方式:

func (r *queryResolver) Articoli(ctx context.Context) ([]model.Articoli, error) {
    var articoli []model.Articoli

    r.DB.Model(&model.Prodotto{}).Select("nome").Find(&articoli)
    r.DB.Model(&model.ProdottoVariante{}).Select("nome").Find(&articoli)

    return articoli, nil
}

我是这样查询的:

query {
  articoli {
    __typename
    ...on Prodotto {
      nome
    }
  }
}

但我收到此错误:

{
  "errors": [
    {
      "message": "must not be null",
      "path": [
        "articoli",
        0
      ]
    }
  ],
  "data": null
}
sql: Scan error on column index 0, name "nome": unsupported Scan, storing driver.Value type string into type *model.Articoli

如何正确解决与 gorm 的联合?

【问题讨论】:

    标签: go graphql go-gorm gqlgen


    【解决方案1】:

    您总是可以尝试在prodottoprodotto_variante 表之间创建连接,并选择所需的列来填充Articoli 结构中的字段。

    我不确定您的 prodottoprodotto_variante 表是如何相互关联的。我还假设nome 列是prodotto 表的一部分,并且它对应于Articoli 结构中的一个字段。代码看起来像这样:

    func (r *queryResolver) Articoli(ctx context.Context) ([]model.Articoli, error) {
        var articoli []model.Articoli
    
        err:= r.DB.Table("prodottos").
                   Join("JOIN prodotto_variantes pv ON prodotto.id = pv.prodotto_id").
                   Find(&articoli).Error
    
        return articoli, err
    }
    

    如果结构字段与prodottos 表中的列匹配,则上述代码应填充整个Articoli 结构。

    如果您只想填充部分字段,可以通过多种方式进行。

    示例 1

    // this should work if populating more than one field
    err:= r.DB.Table("prodottos").
                       Join("JOIN prodotto_variantes pv ON prodotto.id = pv.prodotto_id").
                       Select("prodottos.id, prodottos.nome").
                       Find(&articoli).Error
    

    示例 2

    // this should work if you want to populate only one field
    type Art struct {
       Nome string
    }
    var arts []Art
    err:= r.DB.Table("prodottos").
                       Join("JOIN prodotto_variantes pv ON prodotto.id = pv.prodotto_id").
                       Find(&arts).Error
    

    【讨论】:

    • 它说:“错误:缺少表 \"prodotto\" (SQLSTATE 42P01) 的 FROM 子句条目”,
    • 好的,我在表名称的末尾添加了“s”,现在它说:“”sql:列索引 0 上的扫描错误,名称“nome”:不支持扫描,存储驱动程序。值将字符串输入类型 *models.Articoli",
    • nomeArticoli 结构的一部分吗?您能否将Articoli 结构的定义添加到您的问题中?
    • 如果还有其他需要,您能否提供有关Articoli 结构和您正在使用的数据库架构的更多信息?
    • nome 是 Articoli 结构的一部分
    【解决方案2】:
    func (r *queryResolver) Articoli(ctx context.Context) ([]string, error) {
        articoli := []string{}
    
        err := r.DB.Table("prodotto").
                   Join("JOIN prodotto_variante pv ON prodotto.id = pv.prodotto_id").
                   Select("prodotto.nome").
                   Find(&articoli).Error
    
        return articoli, err
    }
    

    【讨论】:

    • 我无法更改为字符串。它会引发编译器错误
    • 你能获取字符串并将其转换为[]model.Articoli吗?
    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 2017-05-28
    • 2017-10-29
    • 2019-07-01
    • 2018-05-20
    • 2018-01-11
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多