diff --git a/database/gdb/gdb_model_order_group.go b/database/gdb/gdb_model_order_group.go index bf8fbbc01..7922c27f9 100644 --- a/database/gdb/gdb_model_order_group.go +++ b/database/gdb/gdb_model_order_group.go @@ -6,24 +6,37 @@ package gdb -import "strings" +import ( + "github.com/gogf/gf/v2/util/gconv" + "strings" +) // Order sets the "ORDER BY" statement for the model. // // Eg: // Order("id desc") -// Order("id", "desc") // Order("id desc,name asc"). -func (m *Model) Order(orderBy ...string) *Model { +// Order("id", "desc",gdb.Raw("field(id, 3,1,2)")) +func (m *Model) Order(orderBy ...interface{}) *Model { if len(orderBy) == 0 { return m } + model := m.getModel() if model.orderBy != "" { model.orderBy += "," } - model.orderBy = model.db.GetCore().QuoteString(strings.Join(orderBy, " ")) - return model + + for _, o := range orderBy { + switch o.(type) { + case Raw: + model.orderBy += gconv.String(o) + default: + model.orderBy += model.db.GetCore().QuoteString(gconv.String(o)) + } + } + + return m } // OrderAsc sets the "ORDER BY xxx ASC" statement for the model. diff --git a/database/gdb/gdb_z_mysql_model_test.go b/database/gdb/gdb_z_mysql_model_test.go index 66482520e..42e0d761a 100644 --- a/database/gdb/gdb_z_mysql_model_test.go +++ b/database/gdb/gdb_z_mysql_model_test.go @@ -1091,6 +1091,15 @@ func Test_Model_OrderBy(t *testing.T) { t.Assert(len(result), TableSize) t.Assert(result[0]["nickname"].String(), "name_1") }) + + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Order(gdb.Raw("field(id, 10,1,2,3,4,5,6,7,8,9)")).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + t.Assert(result[0]["nickname"].String(), "name_10") + t.Assert(result[1]["nickname"].String(), "name_1") + t.Assert(result[2]["nickname"].String(), "name_2") + }) } func Test_Model_GroupBy(t *testing.T) {