sql >> Base de Datos >  >> RDS >> PostgreSQL

Obtener objeto anidado en estructura en gorm

Parece que querrá hacer dos cosas con lo que tiene:(1) actualizar el modelo para que tenga el enlace de relación correcto y (2) usar .Preload() método si está tratando de hacer que asocie los datos en lectura.

Cambios de modelo

Gorm infiere automáticamente las relaciones en función del nombre de los atributos en su estructura y el nombre de la estructura a la que se hace referencia. El problema es que Google atributo de tipo GoogleAccount no se está asociando porque gorm está buscando una estructura de type Google struct .

También te falta una clave externa en GoogleAccount . ¿Cómo sabría el ORM qué GoogleAccount asociar con qué Client ? Debe agregar un ClientId a tu GoogleAccount definición de estructura.

Además, cambiaría las claves principales que está utilizando para escribir uint ya que ese es el valor predeterminado de gorm (a menos que tenga una buena razón para no usarlo)

Si yo fuera usted, cambiaría las definiciones de mi estructura a lo siguiente:

type Client struct {
     IdClient       uint            `gorm:"primary_key"`
     Name           string
     PhotoUrl       string
     ApprovalNumber uint16
     Phone          string
     Password       string
     HoursOfNotice  int8
     GoogleAccount  GoogleAccount    // Change this to `GoogleAccount`, the same name of your struct
}

type GoogleAccount struct {
     Id             uint
     ClientId       uint             // Foreign key
     Token          string
}

Para obtener más información al respecto, consulte la documentación de las asociaciones aquí:http://gorm. io/asociaciones.html#has-one

Asociaciones de precarga

Ahora que los tiene correctamente relacionados, puede .Preload() obtenga el objeto anidado que desea:

db.Preload("GoogleAccount").First(&user)

Usando .Preload() llenará el user.GoogleAccount atributo con la GoogleAccount asociada correctamente basado en el ClientId .

Para obtener más información al respecto, consulte la documentación de precarga:http://gorm .io/crud.html#preloading-eager-loading