GoFrame 數(shù)據(jù)查詢-Where/WhereOr/WhereNot

2022-04-02 11:47 更新

?ORM?組件提供了一些常用的條件查詢方法,并且條件方法支持多種數(shù)據(jù)類型輸入。

func (m *Model) Where(where interface{}, args...interface{}) *Model
func (m *Model) Wheref(format string, args ...interface{}) *Model
func (m *Model) WherePri(where interface{}, args ...interface{}) *Model
func (m *Model) WhereBetween(column string, min, max interface{}) *Model
func (m *Model) WhereLike(column string, like interface{}) *Model
func (m *Model) WhereIn(column string, in interface{}) *Model
func (m *Model) WhereNull(columns ...string) *Model
func (m *Model) WhereLT(column string, value interface{}) *Model
func (m *Model) WhereLTE(column string, value interface{}) *Model
func (m *Model) WhereGT(column string, value interface{}) *Model
func (m *Model) WhereGTE(column string, value interface{}) *Model

func (m *Model) WhereNotBetween(column string, min, max interface{}) *Model
func (m *Model) WhereNotLike(column string, like interface{}) *Model
func (m *Model) WhereNotIn(column string, in interface{}) *Model
func (m *Model) WhereNotNull(columns ...string) *Model

func (m *Model) WhereOr(where interface{}, args ...interface{}) *Model
func (m *Model) WhereOrBetween(column string, min, max interface{}) *Model
func (m *Model) WhereOrLike(column string, like interface{}) *Model
func (m *Model) WhereOrIn(column string, in interface{}) *Model
func (m *Model) WhereOrNull(columns ...string) *Model
func (m *Model) WhereOrLT(column string, value interface{}) *Model 
func (m *Model) WhereOrLTE(column string, value interface{}) *Model 
func (m *Model) WhereOrGT(column string, value interface{}) *Model 
func (m *Model) WhereOrGTE(column string, value interface{}) *Model

func (m *Model) WhereOrNotBetween(column string, min, max interface{}) *Model
func (m *Model) WhereOrNotLike(column string, like interface{}) *Model
func (m *Model) WhereOrNotIn(column string, in interface{}) *Model
func (m *Model) WhereOrNotNull(columns ...string) *Model

下面我們對其中的幾個常用方法做簡單介紹,其他條件查詢方法用法類似。

Where/WhereOr查詢條件

基本介紹

這兩個方法用于傳遞查詢條件參數(shù),支持的參數(shù)為任意的?string/map/slice/struct/*struct?類型。

?Where?條件參數(shù)推薦使用字符串的參數(shù)傳遞方式(并使用?占位符預(yù)處理),因為?map/struct?類型作為查詢參數(shù)無法保證順序性,且在部分情況下(數(shù)據(jù)庫有時會幫助你自動進行查詢索引優(yōu)化),數(shù)據(jù)庫的索引和你傳遞的查詢條件順序有一定關(guān)系。

當(dāng)使用多個?Where?方法連接查詢條件時,多個條件之間使用?And?進行連接。 此外,當(dāng)存在多個查詢條件時,?gdb?會默認將多個條件分別使用()符號進行包含,這種設(shè)計可以非常友好地支持查詢條件分組。

使用示例:

// WHERE `uid`=1
Where("uid=1")
Where("uid", 1)
Where("uid=?", 1)
Where(g.Map{"uid" : 1})
// WHERE `uid` <= 1000 AND `age` >= 18
Where(g.Map{
    "uid <=" : 1000,
    "age >=" : 18,
})

// WHERE (`uid` <= 1000) AND (`age` >= 18)
Where("uid <=?", 1000).Where("age >=?", 18)

// WHERE `level`=1 OR `money`>=1000000
Where("level=? OR money >=?", 1, 1000000)

// WHERE (`level`=1) OR (`money`>=1000000)
Where("level", 1).WhereOr("money >=", 1000000)

// WHERE `uid` IN(1,2,3)
Where("uid IN(?)", g.Slice{1,2,3})

使用?struct?參數(shù)的示例,其中?orm?的?tag?用于指定?struct?屬性與表字段的映射關(guān)系:

type Condition struct{
    Sex int `orm:"sex"`
    Age int `orm:"age"`
}
Where(Condition{1, 18})
// WHERE `sex`=1 AND `age`=18

使用示例

?Where + string?,條件參數(shù)使用字符串和預(yù)處理。

// 查詢多條記錄并使用Limit分頁
// SELECT * FROM user WHERE uid>1 LIMIT 0,10
g.Model("user").Where("uid > ?", 1).Limit(0, 10).All()

// 使用Fields方法查詢指定字段
// 未使用Fields方法指定查詢字段時,默認查詢?yōu)?
// SELECT uid,name FROM user WHERE uid>1 LIMIT 0,10
g.Model("user").Fileds("uid,name").Where("uid > ?", 1).Limit(0, 10).All()

// 支持多種Where條件參數(shù)類型
// SELECT * FROM user WHERE uid=1 LIMIT 1
g.Model("user").Where("uid=1",).One()
g.Model("user").Where("uid", 1).One()
g.Model("user").Where("uid=?", 1).One()

// SELECT * FROM user WHERE (uid=1) AND (name='john') LIMIT 1
g.Model("user").Where("uid", 1).Where("name", "john").One()
g.Model("user").Where("uid=?", 1).And("name=?", "john").One()

// SELECT * FROM user WHERE (uid=1) OR (name='john') LIMIT 1
g.Model("user").Where("uid=?", 1).Or("name=?", "john").One()

?Where + slice?,預(yù)處理參數(shù)可直接通過?slice?參數(shù)給定。

// SELECT * FROM user WHERE age>18 AND name like '%john%'
g.Model("user").Where("age>? AND name like ?", g.Slice{18, "%john%"}).All()

// SELECT * FROM user WHERE status=1
g.Model("user").Where("status=?", g.Slice{1}).All()

?Where + map?,條件參數(shù)使用任意?map?類型傳遞。

// SELECT * FROM user WHERE uid=1 AND name='john' LIMIT 1
g.Model("user").Where(g.Map{"uid" : 1, "name" : "john"}).One()

// SELECT * FROM user WHERE uid=1 AND age>18 LIMIT 1
g.Model("user").Where(g.Map{"uid" : 1, "age>" : 18}).One()

?Where + struct/*struct?,?struct?標簽支持 ?orm/json?,映射屬性到字段名稱關(guān)系。

type User struct {
    Id       int    `json:"uid"`
    UserName string `orm:"name"`
}
// SELECT * FROM user WHERE uid =1 AND name='john' LIMIT 1
g.Model("user").Where(User{ Id : 1, UserName : "john"}).One()

// SELECT * FROM user WHERE uid =1 LIMIT 1
g.Model("user").Where(&User{ Id : 1}).One()

以上的查詢條件相對比較簡單,我們來看一個比較復(fù)雜的查詢示例。

condition := g.Map{
    "title like ?"         : "%九寨%",
    "online"               : 1,
    "hits between ? and ?" : g.Slice{1, 10},
    "exp > 0"              : nil,
    "category"             : g.Slice{100, 200},
}
// SELECT * FROM article WHERE title like '%九寨%' AND online=1 AND hits between 1 and 10 AND exp > 0 AND category IN(100,200)
g.Model("article").Where(condition).All()

Wheref格式化條件字符串

在某些場景中,在輸入帶有字符串的條件語句時,往往需要結(jié)合?fmt.Sprintf?來格式化條件(當(dāng)然,注意在字符串中使用占位符代替變量的輸入而不是直接將變量格式化),因此我們提供了?Where+fmt.Sprintf?結(jié)合的便捷方法?Wheref?。使用示例:

// WHERE score > 100 and status in('succeeded','completed')
Wheref(`score > ? and status in (?)`, 100, g.Slice{"succeeded", "completed"})

WherePri支持主鍵的查詢條件

?WherePri?方法的功能同?Where?,但提供了對表主鍵的智能識別,常用于根據(jù)主鍵的便捷數(shù)據(jù)查詢。假如?user?表的主鍵為?uid?,我們來看一下?Where?與?WherePri?的區(qū)別:

// WHERE `uid`=1
Where("uid", 1)
WherePri(1)

// WHERE `uid` IN(1,2,3)
Where("uid", g.Slice{1,2,3})
WherePri(g.Slice{1,2,3})

可以看到,當(dāng)使用?WherePri?方法且給定參數(shù)為單一的參數(shù)基本類型或者?slice?類型時,將會被識別為主鍵的查詢條件值。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號