PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ottieni l'oggetto nidificato nella struttura in gorm

Sembra che tu voglia fare due cose con quello che hai:(1) aggiorna il modello in modo da avere il giusto legame di relazione e (2) usa il .Preload() metodo se stai cercando di farlo associare i dati in lettura.

Modifiche al modello

Gorm deduce automaticamente le relazioni in base al nome degli attributi nella tua struttura e al nome della struttura di riferimento. Il problema è che Google attributo di tipo GoogleAccount non si sta associando perché Gorm sta cercando una type Google struct .

Ti manca anche una chiave esterna su GoogleAccount . Come farebbe l'ORM a sapere quale GoogleAccount associare a quale Client ? Dovresti aggiungere un ClientId al tuo GoogleAccount definizione della struttura.

Inoltre, cambierei le chiavi primarie che stai utilizzando per digitare uint dal momento che è ciò che Gorm è predefinito (a meno che tu non abbia una buona ragione per non usarlo)

Se fossi in te, cambierei le mie definizioni di struct come segue:

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
}

Per ulteriori informazioni al riguardo, dai un'occhiata alla documentazione delle associazioni qui:http://gorm. io/associations.html#ha-uno

Precaricamento delle associazioni

Ora che li hai effettivamente correlati correttamente, puoi .Preload() ottieni l'oggetto annidato che desideri:

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

Usando .Preload() popolerà l'user.GoogleAccount attributo con il GoogleAccount correttamente associato in base a ClientId .

Per ulteriori informazioni al riguardo, dai un'occhiata alla documentazione di precaricamento:http://gorm .io/crud.html#preloading-eager-loading