2015-03-20 12 views
9

Son zamanlarda Golang'ı kullanmaya başladım ve GORM'i bir ORM olarak denemeye karar verdim. Çoğu şeyde oldukça iyi çalışır, ancak çoğu ORM bazen sınırlı. Neyse ki veritabanı/sql'e çok iyi bağlanır, böylece kolayca özel sorgulamalar yapabilirim.Gorm Golang bir koleksiyon getiriyor ve onun ilişkileri

Garajda bunu yapmanın başka bir yolu olup olmadığını merak ediyorum: Ben bir yapı var Şirketler, Şirketler bir çok ilişkilere, e-postalara, adreslere ve telefonlara sahiptir. Şirketlerin listesini ve ilgili bilgilerini almak için aşağıdaki kodu kullandım. Gorm'ın Preload fonksiyonunu kullanıyorum.

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

Bu, gayet iyi çalışır. Ancak, Önyükleme işlevi olmadan bunu gerçekleştirmenin başka bir yolu olduğunu hissediyorum. Herhangi bir fikir? (Gerekirse sadece /) the documentation gösterildiği gibi

+0

Aklında ne var? Genelde bir sorgu geri çağırma uygulayabilirsiniz, ama bu çabaya değer olduğunu sanmıyorum. Otomatik Tempo yüklemesi mümkün değildir, çünkü yapı alanları üzerinde bir müdahale mekanizması yoktur. – 0x434D53

+0

Modellerden bir örnek verebilir misiniz? İlişki doğru bir şekilde belirtildiği sürece, bunları "Önyükleme" ye açık bir çağrı olmadan yüklemek zorunda kalırdım. Mevcut nesneyle yabancı anahtar ilişkileri olan birçok öğeyi tutması gereken boş dizileri olan bir nesneyi döndürmektense, yinelemeli bir örneğe neden olan "CascadingRead" gibi bir pakete bir seçenek eklenmemelidir. – evanmcdonnal

cevap

1

Sen DB.Related kullanarak, daha sonra ilgili varlıkları yükleyebilirsiniz:

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

ben belgelerinde başka bir yol göremiyorum.