>  기사  >  백엔드 개발  >  GORM으로 임베디드 구조체를 저장하는 방법은 무엇입니까?

GORM으로 임베디드 구조체를 저장하는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-04 03:09:01840검색

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 마샬링/비마샬링을 위한 대체 솔루션:

이 수정된 솔루션을 사용하면 필드의 자동 마샬링/비마샬링이 가능합니다. 구조체를 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"`
}

이 접근 방식은 Childrens 배열을 childrens 열에 JSON 인코딩 문자열로 저장합니다. 데이터를 검색할 때 GORM은 자동으로 JSON 문자열을 Childrens 배열로 역마샬링합니다.

위 내용은 GORM으로 임베디드 구조체를 저장하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.