when you want to make complex sql,toyorm maybe word better
find the name = "tom" user and it subquery blog title = "first blog" e.g
brick := toy.Model(&User{}).Where("=",Offsetof(User{}.Name),"tom").
Preload(Offsetof(User{}.Blog)).Where("=", Offsetof(Blog{}.Title), "first blog").Enter()
brick.Find(&user)
// raw sql
// select id,name,data, from user where name = "tom" limit 1
// select id,title,content,user_id from blog where user_id = @user.id and title = "first blog"
toyorm select field with Offsetof, it better when you want to refactor struct field name
and you can operation main query as sub query
Lets say I have a relationship where a User has one Profile.
type User Struct { Id int ProfileId int Profile Profile }
type Profile Struct { Id int }
For a load like this:
var u User
db.Model(&User{}).Preload("Profile").Where("id = ?", 7).Take(&u)
Gorm will do something like this:
SELECT * FROM users WHERE id=7;
SELECT * FROM profiles WHERE id=7;
Where a join would be more desirable (only involves 1 trip to the db):
SELECT * FROM users JOIN profiles ON profiles.id=users.profileid WHERE users.id=7
This also has a huge effect on when your initial queries aren't restricted by ID. Gorm will do huge "id IN (1,2,3,4)" queries - or sometimes if I need to filter on a relation (i.e. get users where profile.foo = bar), I end up doing the join getting that data anyways, then the eager queries loads that data again.