2015-03-20 12 views
9

Recentemente ho iniziato a utilizzare Golang e ho deciso di provare GORM come ORM. Funziona molto bene sulla maggior parte delle cose, ma dato che la maggior parte degli ORM a volte è limitata. Fortunatamente si lega molto bene al database/sql in modo da poter fare facilmente query personalizzate.Gorm Golang che recupera una collezione e le sue relazioni

Mi chiedo se ci sia un altro modo per farlo in gorm: Ho una struttura aziendale, le aziende hanno uno a molti rapporti con e-mail, indirizzi e telefoni. Io uso il seguente codice in gorm per estrarre un elenco di aziende e le loro informazioni corrispondenti. Io uso la funzione di precarico di gorm.

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

Questo funziona perfettamente bene. Tuttavia mi sembra che ci sia un altro modo per farlo senza la funzione di precarico. Qualche idea?

+0

Che cosa hai in mente? In generale, è possibile implementare una richiamata di query, ma non credo che ne valga la pena. Il caricamento Lazy automatico non è possibile, poiché non vi è alcun meccanismo di intercettazione nei campi structs. – 0x434D53

+0

Potresti fornire un esempio dei modelli? Mi aspetterei che li carichi senza una chiamata esplicita a 'Preload' finché la relazione viene specificata correttamente. Se no, alcune opzioni dovrebbero essere aggiunte al pacchetto come "CascadingRead' che causa un'istanza ricorsiva piuttosto che restituirmi un oggetto con array vuoti che dovrebbe contenere i molti elementi con cui il mio oggetto corrente ha relazioni di chiavi estranee. – evanmcdonnal

risposta

1

è possibile caricare le entità correlate tardi (solo quando/se necessario), utilizzando DB.Related come mostrato nella the documentation:

// 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 

Non vedo altro modo nella documentazione.

Problemi correlati