2015-03-20 15 views
9

Gần đây tôi đã bắt đầu sử dụng Golang và quyết định thử GORM như một ORM. Nó hoạt động khá tốt trên hầu hết mọi thứ, nhưng như hầu hết các ORM đôi khi nó bị hạn chế. May mắn là nó liên kết rất tốt vào cơ sở dữ liệu/sql để tôi có thể thực hiện các truy vấn tùy chỉnh dễ dàng.Gorm Golang tìm một bộ sưu tập và các mối quan hệ của nó

Tôi tự hỏi nếu có cách nào khác để làm điều này trong gorm: Tôi có một công ty cấu trúc, công ty có một đến nhiều mối quan hệ w/email, địa chỉ và điện thoại. Tôi sử dụng mã sau trong gorm để lấy danh sách các công ty và thông tin tương ứng của họ. Tôi sử dụng chức năng Preload của gorm.

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

Điều này hoạt động hoàn toàn tốt. Tuy nhiên tôi cảm thấy như có một cách khác để thực hiện điều này mà không có chức năng Preload. Bất kỳ ý tưởng?

+0

Bạn nghĩ gì? Tôi nói chung bạn có thể thực hiện một truy vấn gọi lại, nhưng tôi không nghĩ rằng giá trị nỗ lực. Tải Lazy tự động là không thể, vì không có cơ chế chặn trên các trường cấu trúc. – 0x434D53

+0

Bạn có thể đưa ra mẫu của các mô hình không? Tôi mong đợi nó sẽ tải những thứ đó lên mà không có một lời gọi rõ ràng tới 'Preload' miễn là mối quan hệ được xác định chính xác. Nếu không phải một số tùy chọn nên được thêm vào gói như 'CascadingRead' gây ra một sự khởi tạo đệ quy hơn là trả về cho tôi một đối tượng với các mảng trống cần giữ nhiều mục mà đối tượng hiện tại của tôi có quan hệ khoá ngoại. – evanmcdonnal

Trả lời

1

Bạn có thể tải các đối tượng liên quan sau (chỉ khi/nếu cần thiết), sử dụng DB.Related như trong 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 

Tôi không thấy một cách khác trong tài liệu.

Các vấn đề liên quan