ホームページ  >  記事  >  バックエンド開発  >  GORM を使用して埋め込み構造体を保存するには?

GORM を使用して埋め込み構造体を保存するには?

DDD
DDDオリジナル
2024-11-04 03:09:01841ブラウズ

How to Store Embedded Structs with GORM?

GORM を使用した埋め込み構造体の保存

GORM および埋め込み構造体を操作する場合、GORM がこれらの構造体をどのように処理するかを理解することが不可欠です。たとえば、次の構造体について考えてみましょう。

type A struct {
    point GeoPoint
}

type GeoPoint struct {
    Lat float64
    Lon float64
}

デフォルトでは、GORM は埋め込み構造体 (GeoPoint) に対して別のテーブルを作成しようとしますが、これは望ましくない可能性があります。同じテーブル内のフィールドとして構造体を埋め込むには、列タグを使用して GORM に手動で指示する必要があります。

解決策:

埋め込まれた構造体を別の構造体として保存するにはフィールドに gorm:"column:..." タグを埋め込み構造体フィールドに追加します。例:

type A struct {
    GORMModel
    Point GeoPoint `gorm:"embedded;column:point"`
}

embedded オプションを設定すると、GORM は埋め込まれた構造体を認識し、A テーブルに point という名前の新しいフィールドを作成します。列オプションを使用すると、フィールドのカスタム名を指定できます。

JSON マーシャリング/アンマーシャリングの代替ソリューション:

この変更されたソリューションにより、

type Child struct {
    Lat float64
    Lng float64
}

type ChildArray []Child

func (sla *ChildArray) Scan(src interface{}) error {
    return json.Unmarshal(src.([]byte), &sla)
}

func (sla ChildArray) Value() (driver.Value, error) {
    val, err := json.Marshal(sla)
    return string(val), err
}

type Parent struct {
    GORMModel
    Childrens ChildArray `gorm:"column:childrens;type:longtext"`
}

この方法では、子の配列を JSON エンコードされた文字列として子の列に保存します。データを取得するとき、GORM は自動的に JSON 文字列をアンマーシャリングして Childrens 配列に戻します。

以上がGORM を使用して埋め込み構造体を保存するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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