/
model_update.go
91 lines (89 loc) · 2.85 KB
/
model_update.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package gomodel
import (
"github.com/dimonrus/gosql"
"github.com/lib/pq"
"reflect"
)
// GetUpdateSQL model update query
// model - target model
// fields - list of fields that you want to update
func GetUpdateSQL(model IModel, fields ...any) gosql.ISQL {
var ve = reflect.ValueOf(model)
var te = reflect.TypeOf(model).Elem()
if ve.IsNil() {
return nil
}
ve = ve.Elem()
if fields == nil {
fields = model.Values()
}
var hasPrimaryKey bool
var condition = gosql.NewSqlCondition(gosql.ConditionOperatorAnd)
var update = gosql.NewUpdate()
var tField ModelFiledTag
for i := 0; i < ve.NumField(); i++ {
field := ve.Field(i)
for _, v := range fields {
tField.Clear()
cte := reflect.ValueOf(v)
if cte.Kind() != reflect.Ptr {
return nil
}
if ve.Field(i).Addr().Pointer() == cte.Elem().Addr().Pointer() {
ParseModelFiledTag(te.Field(i).Tag.Get("db"), &tField)
if tField.IsPrimaryKey {
hasPrimaryKey = true
if !field.IsNil() {
if field.Kind() == reflect.Slice || field.Kind() == reflect.Array {
condition.AddExpression(tField.Column+" = ?", pq.Array(field.Interface()))
} else {
condition.AddExpression(tField.Column+" = ?", field.Interface())
}
}
} else if tField.IsUnique && !hasPrimaryKey {
if !field.IsNil() {
if field.Kind() == reflect.Slice || field.Kind() == reflect.Array {
condition.AddExpression(tField.Column+" = ?", pq.Array(field.Interface()))
} else {
condition.AddExpression(tField.Column+" = ?", field.Interface())
}
}
} else if !tField.IsIgnored {
if tField.IsCreatedAt {
update.Returning().Append(tField.Column, field.Addr().Interface())
} else if tField.IsUpdatedAt {
if !field.IsNil() {
update.Set().Append(tField.Column+" = ?", field.Interface())
} else {
update.Set().Append(tField.Column + " = NOW()")
}
update.Returning().Append(tField.Column, field.Addr().Interface())
} else if tField.IsDeletedAt {
update.Returning().Append(tField.Column, field.Addr().Interface())
} else if tField.IsSequence {
if !field.IsNil() {
if field.Kind() == reflect.Slice || field.Kind() == reflect.Array {
condition.AddExpression(tField.Column+" = ?", pq.Array(field.Interface()))
} else {
condition.AddExpression(tField.Column+" = ?", field.Interface())
}
}
update.Returning().Append(tField.Column, field.Addr().Interface())
} else {
if field.Kind() == reflect.Slice || field.Kind() == reflect.Array {
update.Set().Append(tField.Column+" = ?", pq.Array(field.Interface()))
} else {
update.Set().Append(tField.Column+" = ?", field.Interface())
}
}
}
}
}
}
if update.IsEmpty() || condition.IsEmpty() {
return nil
}
update.Table(model.Table())
update.Where().Replace(condition)
return update
}