@@ -70,10 +70,12 @@ func Update(config *Config) func(db *gorm.DB) {
7070 if db .Statement .SQL .Len () == 0 {
7171 db .Statement .SQL .Grow (180 )
7272 db .Statement .AddClauseIfNotExists (clause.Update {})
73- if set := ConvertToAssignments (db .Statement ); len (set ) != 0 {
74- db .Statement .AddClause (set )
75- } else if _ , ok := db .Statement .Clauses ["SET" ]; ! ok {
76- return
73+ if _ , ok := db .Statement .Clauses ["SET" ]; ! ok {
74+ if set := ConvertToAssignments (db .Statement ); len (set ) != 0 {
75+ db .Statement .AddClause (set )
76+ } else {
77+ return
78+ }
7779 }
7880
7981 db .Statement .Build (db .Statement .BuildClauses ... )
@@ -158,21 +160,21 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) {
158160 switch stmt .ReflectValue .Kind () {
159161 case reflect .Slice , reflect .Array :
160162 if size := stmt .ReflectValue .Len (); size > 0 {
161- var primaryKeyExprs []clause. Expression
163+ var isZero bool
162164 for i := 0 ; i < size ; i ++ {
163- exprs := make ([]clause.Expression , len (stmt .Schema .PrimaryFields ))
164- var notZero bool
165- for idx , field := range stmt .Schema .PrimaryFields {
166- value , isZero := field .ValueOf (stmt .Context , stmt .ReflectValue .Index (i ))
167- exprs [idx ] = clause.Eq {Column : field .DBName , Value : value }
168- notZero = notZero || ! isZero
169- }
170- if notZero {
171- primaryKeyExprs = append (primaryKeyExprs , clause .And (exprs ... ))
165+ for _ , field := range stmt .Schema .PrimaryFields {
166+ _ , isZero = field .ValueOf (stmt .Context , stmt .ReflectValue .Index (i ))
167+ if ! isZero {
168+ break
169+ }
172170 }
173171 }
174172
175- stmt .AddClause (clause.Where {Exprs : []clause.Expression {clause .Or (primaryKeyExprs ... )}})
173+ if ! isZero {
174+ _ , primaryValues := schema .GetIdentityFieldValuesMap (stmt .Context , stmt .ReflectValue , stmt .Schema .PrimaryFields )
175+ column , values := schema .ToQueryValues ("" , stmt .Schema .PrimaryFieldDBNames , primaryValues )
176+ stmt .AddClause (clause.Where {Exprs : []clause.Expression {clause.IN {Column : column , Values : values }}})
177+ }
176178 }
177179 case reflect .Struct :
178180 for _ , field := range stmt .Schema .PrimaryFields {
0 commit comments