Handle preload
This commit is contained in:
		
							parent
							
								
									8def7be583
								
							
						
					
					
						commit
						41697d58d3
					
				
							
								
								
									
										9
									
								
								callbacks/preload.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								callbacks/preload.go
									
									
									
									
									
										Normal file
									
								
							| @ -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) { | ||||||
|  | } | ||||||
| @ -3,9 +3,12 @@ package callbacks | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"reflect" | 	"reflect" | ||||||
|  | 	"sort" | ||||||
|  | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/jinzhu/gorm" | 	"github.com/jinzhu/gorm" | ||||||
| 	"github.com/jinzhu/gorm/clause" | 	"github.com/jinzhu/gorm/clause" | ||||||
|  | 	"github.com/jinzhu/gorm/schema" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func Query(db *gorm.DB) { | func Query(db *gorm.DB) { | ||||||
| @ -96,6 +99,48 @@ func Query(db *gorm.DB) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Preload(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) { | func AfterQuery(db *gorm.DB) { | ||||||
|  | |||||||
| @ -17,4 +17,6 @@ var ( | |||||||
| 	ErrNotImplemented = errors.New("not implemented") | 	ErrNotImplemented = errors.New("not implemented") | ||||||
| 	// ErrMissingWhereClause missing where clause
 | 	// ErrMissingWhereClause missing where clause
 | ||||||
| 	ErrMissingWhereClause = errors.New("missing WHERE clause while deleting") | 	ErrMissingWhereClause = errors.New("missing WHERE clause while deleting") | ||||||
|  | 	// ErrUnsupportedRelation unsupported relations
 | ||||||
|  | 	ErrUnsupportedRelation = errors.New("unsupported relations") | ||||||
| ) | ) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu