Created
April 17, 2016 18:55
-
-
Save kavirajk/63f369727150455c33c79d0d2ec72c0e to your computer and use it in GitHub Desktop.
Understanding Joins in gorm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"log" | |
"github.com/jinzhu/gorm" | |
_ "github.com/lib/pq" | |
) | |
type Language struct { | |
ID uint `gorm:"primary_key"` | |
Name string | |
} | |
type Movie struct { | |
ID uint `gorm:"primary_key"` | |
Title string | |
Language Language | |
LanguageID uint | |
} | |
type Artist struct { | |
ID uint `gorm:"primary_key"` | |
Name string | |
Movies []Movie `gorm:"many2many:artist_movies"` | |
} | |
func createArtists() { | |
langs := []Language{{Name: "english"}, | |
{Name: "tamil"}, | |
{Name: "hindi"}} | |
for i, _ := range langs { | |
if err := db.Create(&langs[i]).Error; err != nil { | |
log.Fatal(err) | |
} | |
} | |
movies := []Movie{ | |
{Title: "Nayagan", Language: langs[1]}, | |
{Title: "Anbe sivam", Language: langs[1]}, | |
{Title: "3 idiots", Language: langs[2]}, | |
{Title: "Shamithab", Language: langs[2]}, | |
{Title: "Dark Knight", Language: langs[0]}, | |
{Title: "310 to Yuma", Language: langs[0]}, | |
} | |
for i, _ := range movies { | |
if err := db.Create(&movies[i]).Error; err != nil { | |
log.Fatal(err) | |
} | |
} | |
artists := []Artist{{Name: "Madhavan", Movies: []Movie{movies[1], movies[2]}}, | |
{Name: "Kamal Hassan", Movies: []Movie{movies[0], movies[1]}}, | |
{Name: "Dhanush", Movies: []Movie{movies[3]}}, | |
{Name: "Aamir Khan", Movies: []Movie{movies[2]}}, | |
{Name: "Amitabh Bachchan", Movies: []Movie{movies[3]}}, | |
{Name: "Christian Bale", Movies: []Movie{movies[4], movies[5]}}, | |
{Name: "Russell Crowe", Movies: []Movie{movies[5]}}, | |
} | |
for i, _ := range artists { | |
if err := db.Create(&artists[i]).Error; err != nil { | |
log.Fatal(err) | |
} | |
} | |
} | |
var db *gorm.DB | |
func main() { | |
var err error | |
db, err = gorm.Open("postgres", "user=kaviraj password=kaviraj dbname=gorm sslmode=disable") | |
if err != nil { | |
log.Fatal(err) | |
} | |
db.AutoMigrate(new(Language), new(Movie), new(Artist)) | |
// Get the list of all artist who acted in "english" movies | |
var artists []Artist | |
if err = db.Joins("JOIN artist_movies on artist_movies.artist_id=artists.id"). | |
Joins("JOIN movies on movies.id=artist_movies.movie_id"). | |
Joins("JOIN languages on movies.language_id=languages.id"). | |
Where("languages.name=?", "tamil"). | |
Group("artists.id").Preload("Movies").Find(&artists).Error; err != nil { | |
log.Fatal(err) | |
} | |
for _, ar := range artists { | |
fmt.Println(ar.Name) | |
} | |
// Get the list the artists for movie "Nayagan" | |
artists = []Artist{} | |
if err = db.Joins("JOIN artist_movies on artist_movies.artist_id=artists.id"). | |
Joins("JOIN movies on artist_movies.movie_id=movies.id").Where("movies.title=?", "Nayagan"). | |
Group("artists.id").Find(&artists).Error; err != nil { | |
log.Fatal(err) | |
} | |
for _, ar := range artists { | |
fmt.Println(ar.Name) | |
} | |
// Get the list of artists for movies "3 idiots", "Shamitab" and "310 to Yuma" | |
artists = []Artist{} | |
if err = db.Joins("JOIN artist_movies on artist_movies.artist_id=artists.id"). | |
Joins("JOIN movies on artist_movies.movie_id=movies.id"). | |
Where("movies.title in (?)", []string{"3 idiots", "Shamitabh", "310 to Yuma"}). | |
Group("artists.id").Find(&artists).Error; err != nil { | |
log.Fatal(err) | |
} | |
for _, ar := range artists { | |
fmt.Println(ar.Name) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment