PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Holen Sie sich ein verschachteltes Objekt in einer Struktur in Gorm

Es sieht so aus, als würden Sie mit dem, was Sie haben, zwei Dinge tun wollen:(1) Aktualisieren Sie das Modell, damit Sie die richtige Beziehungsbindung haben, und (2) verwenden Sie .Preload() -Methode, wenn Sie versuchen, sie dazu zu bringen, die Daten beim Lesen zuzuordnen.

Modelländerungen

Gorm leitet automatisch Beziehungen basierend auf dem Namen der Attribute in Ihrer Struktur und dem Namen der referenzierten Struktur ab. Das Problem ist, dass Google Attribut vom Typ GoogleAccount verbindet nicht, weil gorm nach einer type Google struct sucht .

Ihnen fehlt auch ein Fremdschlüssel für GoogleAccount . Wie würde das ORM wissen, welches GoogleAccount mit welchem ​​Client verknüpft werden soll ? Sie sollten eine ClientId hinzufügen zu Ihrem GoogleAccount Strukturdefinition.

Außerdem würde ich die Primärschlüssel ändern, die Sie verwenden, um uint einzugeben denn das ist die Standardeinstellung von gorm (es sei denn, Sie haben einen guten Grund, es nicht zu verwenden)

Wenn ich Sie wäre, würde ich meine Strukturdefinitionen wie folgt ändern:

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
}

Weitere Informationen hierzu finden Sie in der Association-Dokumentation hier:http://gorm. io/associations.html#has-one

Verknüpfungen werden vorab geladen

Jetzt, da Sie sie richtig verknüpft haben, können Sie .Preload() Holen Sie sich das gewünschte verschachtelte Objekt:

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

Verwenden von .Preload() wird das user.GoogleAccount auffüllen -Attribut mit dem korrekt verknüpften GoogleAccount basierend auf der ClientId .

Weitere Informationen hierzu finden Sie in der Preloading-Dokumentation:http://gorm .io/crud.html#preloading-eager-loading