gormのScopesが便利だったので記事にしました
UserFind()
とProfileFind()
でWhere
で同じようにID検索する処理があるとする
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
"github.com/k0kubun/pp"
)
type User struct {
gorm.Model
Profile Profile
ProfileID int
Email string
}
type Profile struct {
gorm.Model
Name string
Age int
}
func main() {
db, err := gorm.Open("postgres", "url")
if err != nil {
panic(err)
}
db.AutoMigrate(
&User{},
&Profile{},
)
user := UserFind(db, 1)
pp.Println(user)
profile := ProfileFind(db, 1)
pp.Println(profile)
}
func UserFind(db *gorm.DB, id int) User {
var user User
db.Where("id = ?", id).Find(&user)
return user
}
func ProfileFind(db *gorm.DB, id int) Profile {
var profile Profile
db.Where("id = ?", id).Find(&profile)
return profile
}
これをScopes
を使うとIDで検索する共通のメソッドが作れる
func UserFind(db *gorm.DB, id int) User {
var user User
db.Scopes(SearchByID(id)).Find(&user)
return user
}
func ProfileFind(db *gorm.DB, id int) Profile {
var profile Profile
db.Scopes(SearchByID(id)).Find(&profile)
return profile
}
func SearchByID(id int) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
return db.Where("id = ?", id)
}
}
おわりに
使いようによっては色々な使い方ができそうだなって思った。
便利!使っていこう!