ホームページ  >  記事  >  バックエンド開発  >  GORM の別の構造体内に構造体を埋め込み、それをメイン テーブルのフィールドとして保存するにはどうすればよいですか?

GORM の別の構造体内に構造体を埋め込み、それをメイン テーブルのフィールドとして保存するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 03:20:03910ブラウズ

How do I embed a struct within another struct in GORM and store it as a field in the main table?

GORM による構造体の埋め込み

GORM では、構造体を別の構造体内に埋め込むとき、GORM は埋め込まれた構造体に対して別のテーブルを作成することがあります。ただし、埋め込み構造体をメイン テーブル内の追加フィールドとして保存したい場合は、次のアプローチを利用できます:

解決策:

  1. 定義埋め込み構造体:
<code class="go">type A struct {
    Point *GeoPoint
}

type GeoPoint struct {
    Lat float64
    Lon float64
}</code>
  1. 埋め込み構造体の sql.Scanner インターフェイスと driver.Valuer インターフェイスの実装:
<code class="go">func (gp *GeoPoint) Scan(src interface{}) error {

    // Convert the `src` value to a byte array.
    b, ok := src.([]byte)
    if !ok {
        return fmt.Errorf("could not convert to byte array")
    }

    // Unmarshal the byte array into the `GeoPoint` struct.
    if err := json.Unmarshal(b, gp); err != nil {
        return fmt.Errorf("could not unmarshal JSON: %v", err)
    }

    return nil
}

func (gp GeoPoint) Value() (driver.Value, error) {

    // Marshal the `GeoPoint` struct into a byte array.
    b, err := json.Marshal(gp)
    if err != nil {
        return nil, fmt.Errorf("could not marshal JSON: %v", err)
    }

    return string(b), nil
}</code>
  1. Update gorm:"column" タグと gorm:"type" タグを持つ埋め込み構造体を使用する GORM モデル:
<code class="go">type A struct {
    gorm.Model
    Point *GeoPoint `gorm:"column:point;type:json"`
}</code>

Scan メソッドと Value メソッドを実装することで、GORM は埋め込み構造体を次のように変換できます。 JSON 形式から。 gorm:"column" タグと gorm:"type" タグは、メイン テーブル内の埋め込み構造体の列名とデータ型を指定します。

以上がGORM の別の構造体内に構造体を埋め込み、それをメイン テーブルのフィールドとして保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。