Merge fad7c3f662b4b6d01dac8b26622ecdf998efc08c into 9acaa33324bbcc78239a1c913d4f1292c12177b9
This commit is contained in:
		
						commit
						e4466debec
					
				@ -86,7 +86,7 @@ func (association *Association) Replace(values ...interface{}) *Association {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			newPrimaryKeys := scope.getColumnAsArray(associationForeignFieldNames, field.Interface())
 | 
								newPrimaryKeys := scope.getColumnAsArrayUnique(associationForeignFieldNames, field.Interface())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if len(newPrimaryKeys) > 0 {
 | 
								if len(newPrimaryKeys) > 0 {
 | 
				
			||||||
				sql := fmt.Sprintf("%v NOT IN (%v)", toQueryCondition(scope, associationForeignDBNames), toQueryMarks(newPrimaryKeys))
 | 
									sql := fmt.Sprintf("%v NOT IN (%v)", toQueryCondition(scope, associationForeignDBNames), toQueryMarks(newPrimaryKeys))
 | 
				
			||||||
@ -104,7 +104,7 @@ func (association *Association) Replace(values ...interface{}) *Association {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if sourcePrimaryKeys := scope.getColumnAsArray(sourceForeignFieldNames, scope.Value); len(sourcePrimaryKeys) > 0 {
 | 
								if sourcePrimaryKeys := scope.getColumnAsArrayUnique(sourceForeignFieldNames, scope.Value); len(sourcePrimaryKeys) > 0 {
 | 
				
			||||||
				newDB = newDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(sourcePrimaryKeys)), toQueryValues(sourcePrimaryKeys)...)
 | 
									newDB = newDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(sourcePrimaryKeys)), toQueryValues(sourcePrimaryKeys)...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				association.setErr(relationship.JoinTableHandler.Delete(relationship.JoinTableHandler, newDB, relationship))
 | 
									association.setErr(relationship.JoinTableHandler.Delete(relationship.JoinTableHandler, newDB, relationship))
 | 
				
			||||||
@ -149,7 +149,7 @@ func (association *Association) Delete(values ...interface{}) *Association {
 | 
				
			|||||||
		deletingResourcePrimaryDBNames = append(deletingResourcePrimaryDBNames, field.DBName)
 | 
							deletingResourcePrimaryDBNames = append(deletingResourcePrimaryDBNames, field.DBName)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deletingPrimaryKeys := scope.getColumnAsArray(deletingResourcePrimaryFieldNames, values...)
 | 
						deletingPrimaryKeys := scope.getColumnAsArrayUnique(deletingResourcePrimaryFieldNames, values...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if relationship.Kind == "many_to_many" {
 | 
						if relationship.Kind == "many_to_many" {
 | 
				
			||||||
		// source value's foreign keys
 | 
							// source value's foreign keys
 | 
				
			||||||
@ -169,7 +169,7 @@ func (association *Association) Delete(values ...interface{}) *Association {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// association value's foreign keys
 | 
							// association value's foreign keys
 | 
				
			||||||
		deletingPrimaryKeys := scope.getColumnAsArray(associationForeignFieldNames, values...)
 | 
							deletingPrimaryKeys := scope.getColumnAsArrayUnique(associationForeignFieldNames, values...)
 | 
				
			||||||
		sql := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.AssociationForeignDBNames), toQueryMarks(deletingPrimaryKeys))
 | 
							sql := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.AssociationForeignDBNames), toQueryMarks(deletingPrimaryKeys))
 | 
				
			||||||
		newDB = newDB.Where(sql, toQueryValues(deletingPrimaryKeys)...)
 | 
							newDB = newDB.Where(sql, toQueryValues(deletingPrimaryKeys)...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -182,7 +182,7 @@ func (association *Association) Delete(values ...interface{}) *Association {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if relationship.Kind == "belongs_to" {
 | 
							if relationship.Kind == "belongs_to" {
 | 
				
			||||||
			// find with deleting relation's foreign keys
 | 
								// find with deleting relation's foreign keys
 | 
				
			||||||
			primaryKeys := scope.getColumnAsArray(relationship.AssociationForeignFieldNames, values...)
 | 
								primaryKeys := scope.getColumnAsArrayUnique(relationship.AssociationForeignFieldNames, values...)
 | 
				
			||||||
			newDB = newDB.Where(
 | 
								newDB = newDB.Where(
 | 
				
			||||||
				fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)),
 | 
									fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)),
 | 
				
			||||||
				toQueryValues(primaryKeys)...,
 | 
									toQueryValues(primaryKeys)...,
 | 
				
			||||||
@ -199,7 +199,7 @@ func (association *Association) Delete(values ...interface{}) *Association {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		} else if relationship.Kind == "has_one" || relationship.Kind == "has_many" {
 | 
							} else if relationship.Kind == "has_one" || relationship.Kind == "has_many" {
 | 
				
			||||||
			// find all relations
 | 
								// find all relations
 | 
				
			||||||
			primaryKeys := scope.getColumnAsArray(relationship.AssociationForeignFieldNames, scope.Value)
 | 
								primaryKeys := scope.getColumnAsArrayUnique(relationship.AssociationForeignFieldNames, scope.Value)
 | 
				
			||||||
			newDB = newDB.Where(
 | 
								newDB = newDB.Where(
 | 
				
			||||||
				fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)),
 | 
									fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)),
 | 
				
			||||||
				toQueryValues(primaryKeys)...,
 | 
									toQueryValues(primaryKeys)...,
 | 
				
			||||||
@ -224,7 +224,7 @@ func (association *Association) Delete(values ...interface{}) *Association {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			for i := 0; i < field.Len(); i++ {
 | 
								for i := 0; i < field.Len(); i++ {
 | 
				
			||||||
				reflectValue := field.Index(i)
 | 
									reflectValue := field.Index(i)
 | 
				
			||||||
				primaryKey := scope.getColumnAsArray(deletingResourcePrimaryFieldNames, reflectValue.Interface())[0]
 | 
									primaryKey := scope.getColumnAsArrayUnique(deletingResourcePrimaryFieldNames, reflectValue.Interface())[0]
 | 
				
			||||||
				var isDeleted = false
 | 
									var isDeleted = false
 | 
				
			||||||
				for _, pk := range deletingPrimaryKeys {
 | 
									for _, pk := range deletingPrimaryKeys {
 | 
				
			||||||
					if equalAsString(primaryKey, pk) {
 | 
										if equalAsString(primaryKey, pk) {
 | 
				
			||||||
@ -239,7 +239,7 @@ func (association *Association) Delete(values ...interface{}) *Association {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			association.field.Set(leftValues)
 | 
								association.field.Set(leftValues)
 | 
				
			||||||
		} else if field.Kind() == reflect.Struct {
 | 
							} else if field.Kind() == reflect.Struct {
 | 
				
			||||||
			primaryKey := scope.getColumnAsArray(deletingResourcePrimaryFieldNames, field.Interface())[0]
 | 
								primaryKey := scope.getColumnAsArrayUnique(deletingResourcePrimaryFieldNames, field.Interface())[0]
 | 
				
			||||||
			for _, pk := range deletingPrimaryKeys {
 | 
								for _, pk := range deletingPrimaryKeys {
 | 
				
			||||||
				if equalAsString(primaryKey, pk) {
 | 
									if equalAsString(primaryKey, pk) {
 | 
				
			||||||
					association.field.Set(reflect.Zero(field.Type()))
 | 
										association.field.Set(reflect.Zero(field.Type()))
 | 
				
			||||||
@ -270,13 +270,13 @@ func (association *Association) Count() int {
 | 
				
			|||||||
	if relationship.Kind == "many_to_many" {
 | 
						if relationship.Kind == "many_to_many" {
 | 
				
			||||||
		query = relationship.JoinTableHandler.JoinWith(relationship.JoinTableHandler, query, scope.Value)
 | 
							query = relationship.JoinTableHandler.JoinWith(relationship.JoinTableHandler, query, scope.Value)
 | 
				
			||||||
	} else if relationship.Kind == "has_many" || relationship.Kind == "has_one" {
 | 
						} else if relationship.Kind == "has_many" || relationship.Kind == "has_one" {
 | 
				
			||||||
		primaryKeys := scope.getColumnAsArray(relationship.AssociationForeignFieldNames, scope.Value)
 | 
							primaryKeys := scope.getColumnAsArrayUnique(relationship.AssociationForeignFieldNames, scope.Value)
 | 
				
			||||||
		query = query.Where(
 | 
							query = query.Where(
 | 
				
			||||||
			fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)),
 | 
								fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)),
 | 
				
			||||||
			toQueryValues(primaryKeys)...,
 | 
								toQueryValues(primaryKeys)...,
 | 
				
			||||||
		)
 | 
							)
 | 
				
			||||||
	} else if relationship.Kind == "belongs_to" {
 | 
						} else if relationship.Kind == "belongs_to" {
 | 
				
			||||||
		primaryKeys := scope.getColumnAsArray(relationship.ForeignFieldNames, scope.Value)
 | 
							primaryKeys := scope.getColumnAsArrayUnique(relationship.ForeignFieldNames, scope.Value)
 | 
				
			||||||
		query = query.Where(
 | 
							query = query.Where(
 | 
				
			||||||
			fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.AssociationForeignDBNames), toQueryMarks(primaryKeys)),
 | 
								fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.AssociationForeignDBNames), toQueryMarks(primaryKeys)),
 | 
				
			||||||
			toQueryValues(primaryKeys)...,
 | 
								toQueryValues(primaryKeys)...,
 | 
				
			||||||
 | 
				
			|||||||
@ -126,7 +126,7 @@ func (scope *Scope) handleHasOnePreload(field *Field, conditions []interface{})
 | 
				
			|||||||
	relation := field.Relationship
 | 
						relation := field.Relationship
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// get relations's primary keys
 | 
						// get relations's primary keys
 | 
				
			||||||
	primaryKeys := scope.getColumnAsArray(relation.AssociationForeignFieldNames, scope.Value)
 | 
						primaryKeys := scope.getColumnAsArrayUnique(relation.AssociationForeignFieldNames, scope.Value)
 | 
				
			||||||
	if len(primaryKeys) == 0 {
 | 
						if len(primaryKeys) == 0 {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -175,7 +175,7 @@ func (scope *Scope) handleHasManyPreload(field *Field, conditions []interface{})
 | 
				
			|||||||
	relation := field.Relationship
 | 
						relation := field.Relationship
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// get relations's primary keys
 | 
						// get relations's primary keys
 | 
				
			||||||
	primaryKeys := scope.getColumnAsArray(relation.AssociationForeignFieldNames, scope.Value)
 | 
						primaryKeys := scope.getColumnAsArrayUnique(relation.AssociationForeignFieldNames, scope.Value)
 | 
				
			||||||
	if len(primaryKeys) == 0 {
 | 
						if len(primaryKeys) == 0 {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -231,7 +231,7 @@ func (scope *Scope) handleBelongsToPreload(field *Field, conditions []interface{
 | 
				
			|||||||
	preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions)
 | 
						preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// get relations's primary keys
 | 
						// get relations's primary keys
 | 
				
			||||||
	primaryKeys := scope.getColumnAsArray(relation.ForeignFieldNames, scope.Value)
 | 
						primaryKeys := scope.getColumnAsArrayUnique(relation.ForeignFieldNames, scope.Value)
 | 
				
			||||||
	if len(primaryKeys) == 0 {
 | 
						if len(primaryKeys) == 0 {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -178,7 +178,7 @@ func (s JoinTableHandler) JoinWith(handler JoinTableHandlerInterface, db *DB, so
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		foreignFieldValues := scope.getColumnAsArray(foreignFieldNames, scope.Value)
 | 
							foreignFieldValues := scope.getColumnAsArrayUnique(foreignFieldNames, scope.Value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var condString string
 | 
							var condString string
 | 
				
			||||||
		if len(foreignFieldValues) > 0 {
 | 
							if len(foreignFieldValues) > 0 {
 | 
				
			||||||
@ -189,7 +189,7 @@ func (s JoinTableHandler) JoinWith(handler JoinTableHandlerInterface, db *DB, so
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			condString = fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, quotedForeignDBNames), toQueryMarks(foreignFieldValues))
 | 
								condString = fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, quotedForeignDBNames), toQueryMarks(foreignFieldValues))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			keys := scope.getColumnAsArray(foreignFieldNames, scope.Value)
 | 
								keys := scope.getColumnAsArrayUnique(foreignFieldNames, scope.Value)
 | 
				
			||||||
			values = append(values, toQueryValues(keys))
 | 
								values = append(values, toQueryValues(keys))
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			condString = fmt.Sprintf("1 <> 1")
 | 
								condString = fmt.Sprintf("1 <> 1")
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										34
									
								
								scope.go
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								scope.go
									
									
									
									
									
								
							@ -1270,6 +1270,40 @@ func (scope *Scope) getColumnAsArray(columns []string, values ...interface{}) (r
 | 
				
			|||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (scope *Scope) getColumnAsArrayUnique(columns []string, values ...interface{}) (results [][]interface{}) {
 | 
				
			||||||
 | 
						unfilteredResults := scope.getColumnAsArray(columns, values...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rootMap := map[interface{}]interface{}{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, valueSet := range unfilteredResults {
 | 
				
			||||||
 | 
							currentMap := rootMap
 | 
				
			||||||
 | 
							appendResult := false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for _, value := range valueSet {
 | 
				
			||||||
 | 
								if isBlank(reflect.ValueOf(value)) {
 | 
				
			||||||
 | 
									appendResult = false
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								innerMap, ok := currentMap[value]
 | 
				
			||||||
 | 
								if !ok {
 | 
				
			||||||
 | 
									innerMap = map[interface{}]interface{}{}
 | 
				
			||||||
 | 
									currentMap[value] = innerMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									appendResult = true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								currentMap = innerMap.(map[interface{}]interface{})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if appendResult {
 | 
				
			||||||
 | 
								results = append(results, valueSet)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (scope *Scope) getColumnAsScope(column string) *Scope {
 | 
					func (scope *Scope) getColumnAsScope(column string) *Scope {
 | 
				
			||||||
	indirectScopeValue := scope.IndirectValue()
 | 
						indirectScopeValue := scope.IndirectValue()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user