Refactor nested preload all associations
This commit is contained in:
		
							parent
							
								
									c575a4e719
								
							
						
					
					
						commit
						2055e29eb8
					
				| @ -175,36 +175,26 @@ func Preload(db *gorm.DB) { | |||||||
| 	if db.Error == nil && len(db.Statement.Preloads) > 0 { | 	if db.Error == nil && len(db.Statement.Preloads) > 0 { | ||||||
| 		preloadMap := map[string]map[string][]interface{}{} | 		preloadMap := map[string]map[string][]interface{}{} | ||||||
| 		for name := range db.Statement.Preloads { | 		for name := range db.Statement.Preloads { | ||||||
| 			if name == clause.Associations { | 			preloadFields := strings.Split(name, ".") | ||||||
|  | 			if preloadFields[0] == clause.Associations { | ||||||
| 				for _, rel := range db.Statement.Schema.Relationships.Relations { | 				for _, rel := range db.Statement.Schema.Relationships.Relations { | ||||||
| 					if rel.Schema == db.Statement.Schema { | 					if rel.Schema == db.Statement.Schema { | ||||||
| 						if _, ok := preloadMap[rel.Name]; !ok { | 						if _, ok := preloadMap[rel.Name]; !ok { | ||||||
| 							preloadMap[rel.Name] = map[string][]interface{}{} | 							preloadMap[rel.Name] = map[string][]interface{}{} | ||||||
| 						} | 						} | ||||||
|  | 
 | ||||||
|  | 						if value := strings.TrimPrefix(strings.TrimPrefix(name, preloadFields[0]), "."); value != "" { | ||||||
|  | 							preloadMap[rel.Name][value] = db.Statement.Preloads[name] | ||||||
|  | 						} | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} else { | 			} else { | ||||||
| 				preloadFields := strings.Split(name, ".") | 				if _, ok := preloadMap[preloadFields[0]]; !ok { | ||||||
| 				if preloadFields[0] == clause.Associations { | 					preloadMap[preloadFields[0]] = map[string][]interface{}{} | ||||||
| 					for _, rel := range db.Statement.Schema.Relationships.Relations { | 				} | ||||||
| 						if rel.Schema == db.Statement.Schema { |  | ||||||
| 							if _, ok := preloadMap[rel.Name]; !ok { |  | ||||||
| 								preloadMap[rel.Name] = map[string][]interface{}{} |  | ||||||
| 							} |  | ||||||
| 
 | 
 | ||||||
| 							if value := strings.TrimPrefix(strings.TrimPrefix(name, preloadFields[0]), "."); value != "" { | 				if value := strings.TrimPrefix(strings.TrimPrefix(name, preloadFields[0]), "."); value != "" { | ||||||
| 								preloadMap[rel.Name][value] = db.Statement.Preloads[name] | 					preloadMap[preloadFields[0]][value] = db.Statement.Preloads[name] | ||||||
| 							} |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 				} else { |  | ||||||
| 					if _, ok := preloadMap[preloadFields[0]]; !ok { |  | ||||||
| 						preloadMap[preloadFields[0]] = map[string][]interface{}{} |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 					if value := strings.TrimPrefix(strings.TrimPrefix(name, preloadFields[0]), "."); value != "" { |  | ||||||
| 						preloadMap[preloadFields[0]][value] = db.Statement.Preloads[name] |  | ||||||
| 					} |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -7,11 +7,11 @@ require ( | |||||||
| 	github.com/jinzhu/now v1.1.1 | 	github.com/jinzhu/now v1.1.1 | ||||||
| 	github.com/lib/pq v1.6.0 | 	github.com/lib/pq v1.6.0 | ||||||
| 	github.com/stretchr/testify v1.5.1 | 	github.com/stretchr/testify v1.5.1 | ||||||
| 	gorm.io/driver/mysql v1.0.4 | 	gorm.io/driver/mysql v1.0.5 | ||||||
| 	gorm.io/driver/postgres v1.0.8 | 	gorm.io/driver/postgres v1.0.8 | ||||||
| 	gorm.io/driver/sqlite v1.1.4 | 	gorm.io/driver/sqlite v1.1.4 | ||||||
| 	gorm.io/driver/sqlserver v1.0.6 | 	gorm.io/driver/sqlserver v1.0.6 | ||||||
| 	gorm.io/gorm v1.20.12 | 	gorm.io/gorm v1.21.3 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| replace gorm.io/gorm => ../ | replace gorm.io/gorm => ../ | ||||||
|  | |||||||
| @ -65,6 +65,10 @@ func TestNestedPreload(t *testing.T) { | |||||||
| 	DB.Preload("Pets.Toy").Find(&user2, "id = ?", user.ID) | 	DB.Preload("Pets.Toy").Find(&user2, "id = ?", user.ID) | ||||||
| 
 | 
 | ||||||
| 	CheckUser(t, user2, user) | 	CheckUser(t, user2, user) | ||||||
|  | 
 | ||||||
|  | 	var user3 User | ||||||
|  | 	DB.Preload(clause.Associations+"."+clause.Associations).Find(&user3, "id = ?", user.ID) | ||||||
|  | 	CheckUser(t, user3, user) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestNestedPreloadForSlice(t *testing.T) { | func TestNestedPreloadForSlice(t *testing.T) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu