diff --git a/go.mod b/go.mod index d1ba4316..c9b48131 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,9 @@ go 1.23.0 toolchain go1.24.3 require ( - gorm.io/driver/mysql v1.5.7 - gorm.io/driver/postgres v1.5.11 - gorm.io/driver/sqlite v1.5.7 + gorm.io/driver/mysql v1.6.0 + gorm.io/driver/postgres v1.6.0 + gorm.io/driver/sqlite v1.6.0 gorm.io/driver/sqlserver v1.6.0 gorm.io/gen v0.3.27 gorm.io/gorm v1.30.0 @@ -26,12 +26,12 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/mattn/go-sqlite3 v1.14.28 // indirect - github.com/microsoft/go-mssqldb v1.8.1 // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/mod v0.24.0 // indirect - golang.org/x/sync v0.14.0 // indirect - golang.org/x/text v0.25.0 // indirect - golang.org/x/tools v0.33.0 // indirect + github.com/microsoft/go-mssqldb v1.8.2 // indirect + golang.org/x/crypto v0.39.0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.34.0 // indirect gorm.io/datatypes v1.2.5 // indirect gorm.io/hints v1.1.2 // indirect gorm.io/plugin/dbresolver v1.6.0 // indirect diff --git a/main_test.go b/main_test.go index 60a388f7..27ba8b6e 100644 --- a/main_test.go +++ b/main_test.go @@ -2,6 +2,8 @@ package main import ( "testing" + + "gorm.io/gorm" ) // GORM_REPO: https://github.com/go-gorm/gorm.git @@ -9,7 +11,19 @@ import ( // TEST_DRIVERS: sqlite, mysql, postgres, sqlserver func TestGORM(t *testing.T) { - user := User{Name: "jinzhu"} + user := User{ + Name: "jinzhu", + Pets: []*Pet{ + &Pet{ + Name: "puppy", + }, + &Pet{ + Name: "kitty", + }, + &Pet{ + Name: "puppy", + }, + }} DB.Create(&user) @@ -17,4 +31,19 @@ func TestGORM(t *testing.T) { if err := DB.First(&result, user.ID).Error; err != nil { t.Errorf("Failed, got error: %v", err) } + + if err := DB.Model(&User{}). + Preload("Pets", func(db *gorm.DB) *gorm.DB { + subscope := db.Select("MAX(id) as id").Model(&Pet{}).Group("name") + return db.Where("id in (?)", subscope) + // result :: + // SELECT MAX(id) as id FROM `pets` WHERE `pets`.`user_id` = 1 AND id in (SELECT MAX(id) as id FROM `pets` WHERE `pets`.`user_id` = 1 AND id in () AND `pets`.`deleted_at` IS NULL GROUP BY `name` + // expected :: + // SELECT * FROM `pets` WHERE `pets`.`user_id` = 1 AND id in (SELECT MAX(id) as id FROM `pets` GROUP BY `name`) + }). + Where("id = ?", user.ID). + Find(&result).Error; err != nil { + t.Errorf("failed, get error: %v", err) + } + }