diff --git a/database/gdb/gdb_model.go b/database/gdb/gdb_model.go index 855b1ecae..043a32ccb 100644 --- a/database/gdb/gdb_model.go +++ b/database/gdb/gdb_model.go @@ -90,10 +90,9 @@ func (c *Core) Table(tableNameQueryOrStruct ...interface{}) *Model { // db.Model("? AS a, ? AS b", subQuery1, subQuery2) func (c *Core) Model(tableNameQueryOrStruct ...interface{}) *Model { var ( - tableStr string - tableName string - extraArgs []interface{} - tableNames = make([]string, len(tableNameQueryOrStruct)) + tableStr string + tableName string + extraArgs []interface{} ) // Model creation with sub-query. if len(tableNameQueryOrStruct) > 1 { @@ -106,6 +105,7 @@ func (c *Core) Model(tableNameQueryOrStruct ...interface{}) *Model { } // Normal model creation. if tableStr == "" { + tableNames := make([]string, len(tableNameQueryOrStruct)) for k, v := range tableNameQueryOrStruct { if s, ok := v.(string); ok { tableNames[k] = s @@ -113,7 +113,6 @@ func (c *Core) Model(tableNameQueryOrStruct ...interface{}) *Model { tableNames[k] = tableName } } - if len(tableNames) > 1 { tableStr = fmt.Sprintf( `%s AS %s`, c.QuotePrefixTableName(tableNames[0]), c.QuoteWord(tableNames[1]), @@ -145,17 +144,26 @@ func (c *Core) Raw(rawSql string, args ...interface{}) *Model { return model } +// Raw creates and returns a model based on a raw sql not a table. +// Example: +// db.Raw("SELECT * FROM `user` WHERE `name` = ?", "john").Scan(&result) +// See Core.Raw. +func (m *Model) Raw(rawSql string, args ...interface{}) *Model { + model := m.db.Raw(rawSql, args...) + model.db = m.db + model.tx = m.tx + return model +} + +func (tx *TX) Raw(rawSql string, args ...interface{}) *Model { + return tx.Model().Raw(rawSql, args...) +} + // With creates and returns an ORM model based on meta data of given object. func (c *Core) With(objects ...interface{}) *Model { return c.db.Model().With(objects...) } -// Table is alias of tx.Model. -// Deprecated, use Model instead. -func (tx *TX) Table(tableNameQueryOrStruct ...interface{}) *Model { - return tx.Model(tableNameQueryOrStruct...) -} - // Model acts like Core.Model except it operates on transaction. // See Core.Model. func (tx *TX) Model(tableNameQueryOrStruct ...interface{}) *Model { diff --git a/database/gdb/gdb_z_mysql_transaction_test.go b/database/gdb/gdb_z_mysql_transaction_test.go index cb61b9867..61d68ce68 100644 --- a/database/gdb/gdb_z_mysql_transaction_test.go +++ b/database/gdb/gdb_z_mysql_transaction_test.go @@ -349,7 +349,7 @@ func Test_TX_Update(t *testing.T) { if err := tx.Commit(); err != nil { gtest.Error(err) } - _, err = tx.Table(table).Fields("create_time").Where("id", 3).Value() + _, err = tx.Model(table).Fields("create_time").Where("id", 3).Value() t.AssertNE(err, nil) if value, err := db.Model(table).Fields("create_time").Where("id", 3).Value(); err != nil { @@ -697,7 +697,7 @@ func Test_TX_Delete(t *testing.T) { if _, err := tx.Delete(table, 1); err != nil { gtest.Error(err) } - if n, err := tx.Table(table).Count(); err != nil { + if n, err := tx.Model(table).Count(); err != nil { gtest.Error(err) } else { t.Assert(n, 0)