2015-03-20 12 views
9

Ich fing vor kurzem an, Golang zu benutzen und entschied mich, GORM als ORM auszuprobieren. Es funktioniert ziemlich gut auf den meisten Dingen, aber wie die meisten ORMs sind manchmal begrenzt. Zum Glück knüpft es sehr gut an Datenbank/SQL an, so dass ich leicht benutzerdefinierte Abfragen ausführen kann.Gorm Golang holt eine Sammlung und ihre Beziehungen

Ich frage mich, ob es eine andere Möglichkeit gibt, dies in Gorm zu tun: Ich habe eine Struktur Unternehmen, Unternehmen haben eine zu viele Beziehungen w/E-Mails, Adressen und Telefone. Ich benutze den folgenden Code in gorm, um eine Liste von Unternehmen und ihre entsprechenden Informationen zu ziehen. Ich benutze Gorms Preload-Funktion.

db.DBAccess. 
    Model(&companies). 
    Count(&dbInfo.Count). 
    Order("companies.id asc"). 
    Offset(offset). 
    Limit(length). 
    Preload("Addresses"). 
    Preload("Phones"). 
    Preload("Emails"). 
    Find(&companies) 

Das funktioniert einwandfrei. Ich habe jedoch das Gefühl, dass es eine andere Möglichkeit gibt, dies ohne die Preload-Funktion zu erreichen. Irgendwelche Ideen?

+0

Was haben Sie vor? Ich allgemein könnte Sie eine Abfrage Callback implementieren, aber ich denke nicht, dass die Mühe wert. Automatisches Lazy-Laden ist nicht möglich, da in den Feldern von Strukturen kein Interceptionsmechanismus vorhanden ist. – 0x434D53

+0

Können Sie eine Probe der Modelle geben? Ich würde erwarten, dass es diese ohne einen expliziten Aufruf von 'Preload 'lädt, solange die Beziehung korrekt angegeben ist. Wenn nicht, sollte eine Option wie 'CascadingRead' zum Paket hinzugefügt werden, die eine rekursive Instanziierung verursacht, anstatt mir ein Objekt mit leeren Arrays zurückzugeben, das die vielen Elemente enthalten sollte, mit denen mein aktuelles Objekt Fremdschlüsselbeziehungen hat. – evanmcdonnal

Antwort

1

Sie können später die zugehörigen Entitäten laden (nur wenn/falls erforderlich), mit DB.Related wie in the documentation gezeigt:

// User has many emails 
db.Model(&user).Related(&emails) 
//// SELECT * FROM emails WHERE user_id = 111; 
// user_id is the foreign key, 111 is user's primary key's value 

// Specify the foreign key 
db.Model(&user).Related(&emails, "ProfileId") 
//// SELECT * FROM emails WHERE profile_id = 111; 
// profile_id is the foreign key, 111 is user's primary key's value 

ich in der Dokumentation eine andere Art und Weise nicht.

Verwandte Themen