mirror of
https://gitee.com/johng/gf
synced 2026-06-06 02:25:47 +08:00
add FieldsEx function for gdb.Model
This commit is contained in:
@ -30,6 +30,7 @@ type Model struct {
|
||||
tablesInit string // 初始化Model时的表名称(可以是多个)
|
||||
tables string // 数据库操作表
|
||||
fields string // 操作字段
|
||||
fieldsEx string // 操作字段(排除)
|
||||
where string // 操作条件
|
||||
whereArgs []interface{} // 操作条件参数
|
||||
whereHolder []*whereHolder // 操作条件预处理
|
||||
@ -183,6 +184,26 @@ func (md *Model) Fields(fields string) *Model {
|
||||
return model
|
||||
}
|
||||
|
||||
// 链式操作,查询字段(排除)
|
||||
func (md *Model) FieldsEx(fields string) *Model {
|
||||
model := md.getModel()
|
||||
model.fieldsEx = fields
|
||||
fieldsExSet := gset.NewStrSetFrom(gstr.SplitAndTrim(fields, ","))
|
||||
if m, err := md.db.TableFields(md.tables); err == nil {
|
||||
model.fields = ""
|
||||
for k, _ := range m {
|
||||
if fieldsExSet.Contains(k) {
|
||||
continue
|
||||
}
|
||||
if len(model.fields) > 0 {
|
||||
model.fields += ","
|
||||
}
|
||||
model.fields += k
|
||||
}
|
||||
}
|
||||
return model
|
||||
}
|
||||
|
||||
// 链式操作,选项设置
|
||||
func (md *Model) Option(option int) *Model {
|
||||
model := md.getModel()
|
||||
@ -393,17 +414,20 @@ func (md *Model) doFilterDataMapForInsertOrUpdate(data Map, allowOmitEmpty bool)
|
||||
m.FilterEmpty()
|
||||
data = m.Map()
|
||||
}
|
||||
// Keep specified fields.
|
||||
|
||||
if len(md.fields) > 0 && md.fields != "*" {
|
||||
set := gset.NewStrSet()
|
||||
for _, v := range gstr.SplitAndTrimSpace(md.fields, ",") {
|
||||
set.Add(v)
|
||||
}
|
||||
for k, _ := range data {
|
||||
// Keep specified fields.
|
||||
set := gset.NewStrSetFrom(gstr.SplitAndTrim(md.fields, ","))
|
||||
for k := range data {
|
||||
if !set.Contains(k) {
|
||||
delete(data, k)
|
||||
}
|
||||
}
|
||||
} else if len(md.fieldsEx) > 0 {
|
||||
// Filter specified fields.
|
||||
for _, v := range gstr.SplitAndTrim(md.fieldsEx, ",") {
|
||||
delete(data, v)
|
||||
}
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
@ -1172,3 +1172,37 @@ func Test_Model_Option_Where(t *testing.T) {
|
||||
gtest.Assert(v.String(), "1")
|
||||
})
|
||||
}
|
||||
|
||||
func Test_Model_FieldsEx(t *testing.T) {
|
||||
table := createInitTable()
|
||||
defer dropTable(table)
|
||||
// Select.
|
||||
gtest.Case(t, func() {
|
||||
r, err := db.Table(table).FieldsEx("create_time, id").Where("id in (?)", g.Slice{1, 2}).OrderBy("id asc").All()
|
||||
gtest.Assert(err, nil)
|
||||
gtest.Assert(len(r), 2)
|
||||
gtest.Assert(len(r[0]), 3)
|
||||
gtest.Assert(r[0]["id"], "")
|
||||
gtest.Assert(r[0]["passport"], "user_1")
|
||||
gtest.Assert(r[0]["password"], "pass_1")
|
||||
gtest.Assert(r[0]["nickname"], "name_1")
|
||||
gtest.Assert(r[0]["create_time"], "")
|
||||
gtest.Assert(r[1]["id"], "")
|
||||
gtest.Assert(r[1]["passport"], "user_2")
|
||||
gtest.Assert(r[1]["password"], "pass_2")
|
||||
gtest.Assert(r[1]["nickname"], "name_2")
|
||||
gtest.Assert(r[1]["create_time"], "")
|
||||
})
|
||||
// Filter.
|
||||
gtest.Case(t, func() {
|
||||
r, err := db.Table(table).FieldsEx("password").Data(g.Map{"nickname": "123", "password": "456"}).Where("id", 3).Update()
|
||||
gtest.Assert(err, nil)
|
||||
n, _ := r.RowsAffected()
|
||||
gtest.Assert(n, 1)
|
||||
|
||||
one, err := db.Table(table).Where("id", 3).One()
|
||||
gtest.Assert(err, nil)
|
||||
gtest.Assert(one["nickname"], "123")
|
||||
gtest.AssertNE(one["password"], "456")
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user