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 サイトの他の関連記事を参照してください。