From 41697d58d3b02b26c2f9af782052e3d39578b205 Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Thu, 7 May 2020 10:03:48 +0800 Subject: [PATCH] Handle preload --- callbacks/preload.go | 9 +++++++++ callbacks/query.go | 45 ++++++++++++++++++++++++++++++++++++++++++++ errors.go | 2 ++ 3 files changed, 56 insertions(+) create mode 100644 callbacks/preload.go diff --git a/callbacks/preload.go b/callbacks/preload.go new file mode 100644 index 00000000..c8dcd05e --- /dev/null +++ b/callbacks/preload.go @@ -0,0 +1,9 @@ +package callbacks + +import ( + "github.com/jinzhu/gorm" + "github.com/jinzhu/gorm/schema" +) + +func preload(db *gorm.DB, preloadFields []string, rel *schema.Relationship) { +} diff --git a/callbacks/query.go b/callbacks/query.go index a3b59b48..ca9e84a9 100644 --- a/callbacks/query.go +++ b/callbacks/query.go @@ -3,9 +3,12 @@ package callbacks import ( "fmt" "reflect" + "sort" + "strings" "github.com/jinzhu/gorm" "github.com/jinzhu/gorm/clause" + "github.com/jinzhu/gorm/schema" ) func Query(db *gorm.DB) { @@ -96,6 +99,48 @@ func Query(db *gorm.DB) { } func Preload(db *gorm.DB) { + if len(db.Statement.Preloads) > 0 { + preloadMap := map[string][]string{} + + for name := range db.Statement.Preloads { + preloadFields := strings.Split(name, ".") + for idx := range preloadFields { + preloadMap[strings.Join(preloadFields[:idx+1], ".")] = preloadFields[:idx+1] + } + } + + preloadNames := make([]string, len(preloadMap)) + idx := 0 + for key := range preloadMap { + preloadNames[idx] = key + idx++ + } + sort.Strings(preloadNames) + + for _, name := range preloadNames { + curSchema := db.Statement.Schema + preloadFields := preloadMap[name] + + for idx, preloadField := range preloadFields { + if rel := curSchema.Relationships.Relations[preloadField]; rel != nil { + if idx == len(preloadFields)-1 { + conds := db.Statement.Preloads[strings.Join(preloadFields[:idx+1], ".")] + + switch rel.Type { + case schema.HasOne: + case schema.HasMany: + case schema.BelongsTo: + case schema.Many2Many: + } + } else { + curSchema = rel.FieldSchema + } + } else { + db.AddError(fmt.Errorf("%v: %w", name, gorm.ErrUnsupportedRelation)) + } + } + } + } } func AfterQuery(db *gorm.DB) { diff --git a/errors.go b/errors.go index 32f55e01..a990cc4a 100644 --- a/errors.go +++ b/errors.go @@ -17,4 +17,6 @@ var ( ErrNotImplemented = errors.New("not implemented") // ErrMissingWhereClause missing where clause ErrMissingWhereClause = errors.New("missing WHERE clause while deleting") + // ErrUnsupportedRelation unsupported relations + ErrUnsupportedRelation = errors.New("unsupported relations") )