a) SQL Builder: JOIN Queries and Struct Composition
Now, let’s suppose you have independent Go structs (each one mapped to a different table) and a JOIN query that returns a result combining columns from all the mapped tables.
In this scenario, you can create a new struct and embed all the structs using
the inline option (db:",inline"), like in the following example (where
Book, Author, and Subject are independent structs):
type BookAuthorSubject struct {
Book `db:",inline"`
Author `db:",inline"`
Subject `db:",inline"`
}
… and then create the JOIN query using the builder:
q := sess.Select("b.id AS book_id", "*").
From("books AS b").
Join("subjects AS s").On("b.subject_id = s.id").
Join("authors AS a").On("b.author_id = a.id").
OrderBy("a.last_name", "b.title")
Note that an alias for book_id is created with Select("b.id AS book_id",
"*"). This is because all three embedded structs have a field with the same
name (id), which is ambiguous. The final struct (BookAuthorSubject) should
look like this:
type BookAuthorSubject struct {
BookID uint `db:"book_id"`
Book `db:",inline"`
Author `db:",inline"`
Subject `db:",inline"`
}
Finally, use All to copy every single result of the query into the books
slice:
var books []BookAuthorSubject
err := q.All(&books)