# Join的使用
* Join(string,interface{},string)
第一個參數為連接類型,當前支持INNER, LEFT OUTER, CROSS中的一個值, 第二個參數為string類型的表名,表對應的結構體指針或者為兩個值的[]string,表示表名和別名, 第三個參數為連接條件。
以下將通過示例來講解具體的用法:
假如我們擁有兩個表user和group,每個User只在一個Group中,那么我們可以定義對應的struct
~~~
type Group struct {
Id int64
Name string
}
~~~
~~~
type User struct {
Id int64
Name string
GroupId int64 `xorm:"index"`
}
~~~
OK。問題來了,我們現在需要列出所有的User,并且列出對應的GroupName。利用extends和Join我們可以比較優雅的解決這個問題。代碼如下:
~~~
type UserGroup struct {
User `xorm:"extends"`
Name string
}
func (UserGroup) TableName() string {
return "user"
}
users := make([]UserGroup, 0)
engine.Join("INNER", "group", "group.id = user.group_id").Find(&users)
~~~
這里我們將User這個匿名結構體加了xorm的extends標記(實際上也可以是非匿名的結構體,只要有extends標記即可),這樣就減少了重復代碼的書寫。實際上這里我們直接用Sql函數也是可以的,并不一定非要用Join。
~~~
users := make([]UserGroup, 0)
engine.Sql("select user.*, group.name from user, group where user.group_id = group.id").Find(&users)
~~~
然后,我們忽然發現,我們還需要顯示Group的Id,因為我們需要鏈接到Group頁面。這樣又要加一個字段,算了,不如我們把Group也加個extends標記吧,代碼如下:
~~~
type UserGroup struct {
User `xorm:"extends"`
Group `xorm:"extends"`
}
func (UserGroup) TableName() string {
return "user"
}
users := make([]UserGroup, 0)
engine.Join("INNER", "group", "group.id = user.group_id").Find(&users)
~~~
這次,我們把兩個表的所有字段都查詢出來了,并且賦值到對應的結構體上了。
這里要注意,User和Group分別有Id和Name,這個是重名的,但是xorm是可以區分開來的,不過需要特別注意UserGroup中User和Group的順序,如果順序反了,則有可能會賦值錯誤,但是程序不會報錯。
這里的順序應遵循如下原則:
~~~
結構體中extends標記對應的結構順序應和最終生成SQL中對應的表出現的順序相同。
~~~
還有一點需要注意的,如果在模板中使用這個UserGroup結構體,對于字段名重復的必須加匿名引用,如:
對于不重復字段,可以{{.GroupId}},對于重復字段{{.User.Id}}和{{.Group.Id}}
這是2個表的用法,3個或更多表用法類似,如:
~~~
type Type struct {
Id int64
Name string
}
type UserGroupType struct {
User `xorm:"extends"`
Group `xorm:"extends"`
Type `xorm:"extends"`
}
users := make([]UserGroupType, 0)
engine.Table("user").Join("INNER", "group", "group.id = user.group_id").
Join("INNER", "type", "type.id = user.type_id").
Find(&users)
~~~
同時,在使用Join時,也可同時使用Where和Find的第二個參數作為條件,Find的第二個參數同時也允許為各種bean來作為條件。Where里可以是各個表的條件,Find的第二個參數只是被關聯表的條件。
~~~
engine.Table("user").Join("INNER", "group", "group.id = user.group_id").
Join("INNER", "type", "type.id = user.type_id").
Where("user.name like ?", "%"+name+"%").Find(&users, &User{Name:name})
~~~
當然,如果表名字太長,我們可以使用別名:
~~~
engine.Table("user").Alias("u").
Join("INNER", []string{"group", "g"}, "g.id = u.group_id").
Join("INNER", "type", "type.id = u.type_id").
Where("u.name like ?", "%"+name+"%").Find(&users, &User{Name:name})
~~~
- xorm
- 創建Orm引擎
- 定義表結構體
- 名稱映射規則
- 前綴映射,后綴映射和緩存映射
- 使用Table和Tag改變名稱映射
- Column屬性定義
- 表結構操作
- 獲取數據庫信息
- 表操作
- 創建索引和唯一索引
- 同步數據庫結構
- 導入導出SQL腳本
- SqlMap及SqlTemplate模板
- 初始化SqlMap配置文件及SqlTemplate模板
- SqlMap及SqlTemplate相關功能API
- SqlMap配置文件及SqlTemplate模板加密存儲及解析
- 手動管理SqlMap配置及SqlTemplate模板
- 插入數據
- ORM方式插入數據
- 執行SQL命令插入數據
- 創建時間Created
- 查詢和統計數據
- ORM方式查詢和統計數據
- 查詢條件方法
- 臨時開關方法
- Get方法
- Find方法
- Join的使用
- Iterate方法
- Count方法
- Rows方法
- Sum系列方法
- Exist方法
- 子查詢
- 執行SQL查詢
- 執行SQL查詢的11種常用方式
- 查詢返回json或xml字符串
- 鏈式查詢據操返回某條記錄的某個字段的值
- SqlTemplateClient執行過程
- 關于數據庫分頁查詢
- 更新數據
- ORM方式更新數據
- Update方法
- 樂觀鎖Version
- 更新時間Updated
- 執行SQL命令更新數據
- 刪除數據
- ORM方式刪除數據
- Delete方法
- 軟刪除Deleted
- 執行SQL命令刪除數據
- 事務處理
- 簡單事務模型
- 嵌套事務模型
- 八種事務類型及事務傳播機制
- 簡單事務相關API
- 嵌套事務相關API
- 嵌套事務示例代碼
- 主從數據庫(Master/Slave)讀寫分離
- 創建引擎組
- 負載策略
- 引擎組其他配置方法
- 數據庫讀寫分離
- 批量混合SQL操作
- SQL Builder
- 緩存
- 事件
- 數據導出
- Dump數據庫結構和數據
- 查詢結果集導出csv、tsv、xml、json、xlsx、yaml、html
- 多Sheet頁數據導出
- 日志
- 連接池
- xorm 工具
- 常見問題
- 感謝支持