2017-11-02 3 views
1

Ich habe eine Reihe von Kategorien des Typs Product. Es gibt nur 3 von ihnen, also kann ich für jeden eine Tabelle erstellen. Rufen wir sie SubProductA, SubProductB und SubProductC. Sie sind eindeutig genug, dass das Speichern in den Eltern- Tisch ein Durcheinander machen würde.Wie macht man eine Eins-zu-Eins-Beziehung in GORM?

So natürlich, ich erlaube nur den Primärschlüssel, der Fremdschlüssel zu sein, der zurück zum Produkt für jedes von diesen verbindet. GORM scheint jedoch nicht in der Lage zu sein, ein Feld wie dieses vorzuladen. Hier ist, was ich habe (als Beispiel) für eine von ihnen:

type SubProductA struct { 
    ProductID uint64 `gorm:"primary_key;ForeignKey:ProductID"` 
    Product Product 
    CreatedAt   time.Time 
    UpdatedAt   time.Time 
    DeletedAt   *time.Time 
} 

Allerdings, wenn ich eine Abfrage wie

db.Where("product_id=?", p.ID).Preload("Product").First(&subProduct).Error 

Das Ergebnis laufen ist:

Can't preload field Product for models.SubProductA.

Ich vermute, das liegt daran, dass ich den Primärschlüssel nicht korrekt als Fremdschlüssel identifiziere. Ich habe jedoch eine Menge verschiedener Dinge ausprobiert und bekomme den gleichen Fehler.

Gibt es eine Möglichkeit, dies zu erreichen?

Antwort

0

Um meine eigene Frage für Leute antworten durch ...

vorbei Es scheint, dass GORM Probleme mit mehreren Ebenen Eins-zu-eins-Beziehungen hat. Für eine einzelne Ebene, das Beispiel, das ich gab, funktioniert es, ohne etwas mehr zu benötigen. Um jedoch eine Vorspannung auf ein Feld zu tun, die auch eine weiter den Baum hinauf Eins-zu-eins mit demselben Schlüssel ist, musste ich folgendes tun:

type SubSubProductA struct { 
    SubProductID uint64 `gorm:"primary_key"` 
    SubProductA SubProductA `gorm:"ForeignKey:SubProductID`" 
    CreatedAt   time.Time 
    UpdatedAt   time.Time 
    DeletedAt   *time.Time 
} 

Mit anderen Worten, die ForeignKey Teil geht auf das Objekt selbst. Das hat die Vorspannung für mich behoben. Hoffe, das hilft jemandem. Die GORM-Dokumentation ist nur für die üblichen Fälle sehr spärlich.