fix: throw err if association model miss primary key (#5187)
This commit is contained in:
		
							parent
							
								
									9a4d10be64
								
							
						
					
					
						commit
						3d7019a7c2
					
				| @ -187,8 +187,11 @@ func (association *Association) Delete(values ...interface{}) error { | |||||||
| 			tx := association.DB.Model(reflect.New(rel.Schema.ModelType).Interface()) | 			tx := association.DB.Model(reflect.New(rel.Schema.ModelType).Interface()) | ||||||
| 
 | 
 | ||||||
| 			_, pvs := schema.GetIdentityFieldValuesMap(association.DB.Statement.Context, reflectValue, rel.Schema.PrimaryFields) | 			_, pvs := schema.GetIdentityFieldValuesMap(association.DB.Statement.Context, reflectValue, rel.Schema.PrimaryFields) | ||||||
| 			pcolumn, pvalues := schema.ToQueryValues(rel.Schema.Table, rel.Schema.PrimaryFieldDBNames, pvs) | 			if pcolumn, pvalues := schema.ToQueryValues(rel.Schema.Table, rel.Schema.PrimaryFieldDBNames, pvs); len(pvalues) > 0 { | ||||||
| 			conds = append(conds, clause.IN{Column: pcolumn, Values: pvalues}) | 				conds = append(conds, clause.IN{Column: pcolumn, Values: pvalues}) | ||||||
|  | 			} else { | ||||||
|  | 				return ErrPrimaryKeyRequired | ||||||
|  | 			} | ||||||
| 
 | 
 | ||||||
| 			_, rvs := schema.GetIdentityFieldValuesMapFromValues(association.DB.Statement.Context, values, primaryFields) | 			_, rvs := schema.GetIdentityFieldValuesMapFromValues(association.DB.Statement.Context, values, primaryFields) | ||||||
| 			relColumn, relValues := schema.ToQueryValues(rel.Schema.Table, foreignKeys, rvs) | 			relColumn, relValues := schema.ToQueryValues(rel.Schema.Table, foreignKeys, rvs) | ||||||
| @ -199,8 +202,11 @@ func (association *Association) Delete(values ...interface{}) error { | |||||||
| 			tx := association.DB.Model(reflect.New(rel.FieldSchema.ModelType).Interface()) | 			tx := association.DB.Model(reflect.New(rel.FieldSchema.ModelType).Interface()) | ||||||
| 
 | 
 | ||||||
| 			_, pvs := schema.GetIdentityFieldValuesMap(association.DB.Statement.Context, reflectValue, primaryFields) | 			_, pvs := schema.GetIdentityFieldValuesMap(association.DB.Statement.Context, reflectValue, primaryFields) | ||||||
| 			pcolumn, pvalues := schema.ToQueryValues(rel.FieldSchema.Table, foreignKeys, pvs) | 			if pcolumn, pvalues := schema.ToQueryValues(rel.FieldSchema.Table, foreignKeys, pvs); len(pvalues) > 0 { | ||||||
| 			conds = append(conds, clause.IN{Column: pcolumn, Values: pvalues}) | 				conds = append(conds, clause.IN{Column: pcolumn, Values: pvalues}) | ||||||
|  | 			} else { | ||||||
|  | 				return ErrPrimaryKeyRequired | ||||||
|  | 			} | ||||||
| 
 | 
 | ||||||
| 			_, rvs := schema.GetIdentityFieldValuesMapFromValues(association.DB.Statement.Context, values, rel.FieldSchema.PrimaryFields) | 			_, rvs := schema.GetIdentityFieldValuesMapFromValues(association.DB.Statement.Context, values, rel.FieldSchema.PrimaryFields) | ||||||
| 			relColumn, relValues := schema.ToQueryValues(rel.FieldSchema.Table, rel.FieldSchema.PrimaryFieldDBNames, rvs) | 			relColumn, relValues := schema.ToQueryValues(rel.FieldSchema.Table, rel.FieldSchema.PrimaryFieldDBNames, rvs) | ||||||
| @ -229,8 +235,11 @@ func (association *Association) Delete(values ...interface{}) error { | |||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			_, pvs := schema.GetIdentityFieldValuesMap(association.DB.Statement.Context, reflectValue, primaryFields) | 			_, pvs := schema.GetIdentityFieldValuesMap(association.DB.Statement.Context, reflectValue, primaryFields) | ||||||
| 			pcolumn, pvalues := schema.ToQueryValues(rel.JoinTable.Table, joinPrimaryKeys, pvs) | 			if pcolumn, pvalues := schema.ToQueryValues(rel.JoinTable.Table, joinPrimaryKeys, pvs); len(pvalues) > 0 { | ||||||
| 			conds = append(conds, clause.IN{Column: pcolumn, Values: pvalues}) | 				conds = append(conds, clause.IN{Column: pcolumn, Values: pvalues}) | ||||||
|  | 			} else { | ||||||
|  | 				return ErrPrimaryKeyRequired | ||||||
|  | 			} | ||||||
| 
 | 
 | ||||||
| 			_, rvs := schema.GetIdentityFieldValuesMapFromValues(association.DB.Statement.Context, values, relPrimaryFields) | 			_, rvs := schema.GetIdentityFieldValuesMapFromValues(association.DB.Statement.Context, values, relPrimaryFields) | ||||||
| 			relColumn, relValues := schema.ToQueryValues(rel.JoinTable.Table, joinRelPrimaryKeys, rvs) | 			relColumn, relValues := schema.ToQueryValues(rel.JoinTable.Table, joinRelPrimaryKeys, rvs) | ||||||
|  | |||||||
| @ -261,3 +261,27 @@ func TestSaveHasManyCircularReference(t *testing.T) { | |||||||
| 			children, parent.Children) | 			children, parent.Children) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func TestAssociationError(t *testing.T) { | ||||||
|  | 	DB = DB.Debug() | ||||||
|  | 	user := *GetUser("TestAssociationError", Config{Pets: 2, Company: true, Account: true, Languages: 2}) | ||||||
|  | 	DB.Create(&user) | ||||||
|  | 
 | ||||||
|  | 	var user1 User | ||||||
|  | 	DB.Preload("Company").Preload("Pets").Preload("Account").Preload("Languages").First(&user1) | ||||||
|  | 
 | ||||||
|  | 	var emptyUser User | ||||||
|  | 	var err error | ||||||
|  | 	// belongs to
 | ||||||
|  | 	err = DB.Model(&emptyUser).Association("Company").Delete(&user1.Company) | ||||||
|  | 	AssertEqual(t, err, gorm.ErrPrimaryKeyRequired) | ||||||
|  | 	// has many
 | ||||||
|  | 	err = DB.Model(&emptyUser).Association("Pets").Delete(&user1.Pets) | ||||||
|  | 	AssertEqual(t, err, gorm.ErrPrimaryKeyRequired) | ||||||
|  | 	// has one
 | ||||||
|  | 	err = DB.Model(&emptyUser).Association("Account").Delete(&user1.Account) | ||||||
|  | 	AssertEqual(t, err, gorm.ErrPrimaryKeyRequired) | ||||||
|  | 	// many to many
 | ||||||
|  | 	err = DB.Model(&emptyUser).Association("Languages").Delete(&user1.Languages) | ||||||
|  | 	AssertEqual(t, err, gorm.ErrPrimaryKeyRequired) | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Cr
						Cr