add FieldsEx function for gdb.Model

This commit is contained in:
John
2019-10-29 19:45:21 +08:00
parent 3ef42bfbf0
commit 1ab7f00b91
2 changed files with 64 additions and 6 deletions

View File

@ -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
}

View File

@ -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")
})
}