2

我有两个具体类型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 的工会?

4

2 回答 2

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
}

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

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

示例 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
于 2022-02-03T00:46:44.453 回答
-1
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
}
于 2022-02-03T06:08:43.567 回答