# 連貫操作
[上一頁](# "上一頁")[下一頁](# "下一頁")
ThinkPHP模型基礎類提供的連貫操作方法,可以有效的提高數據存取的代碼清晰度和開發效率,并且支持所有的CURD操作。使用也比較簡單, 假如我們現在要查詢一個User表的滿足狀態為1的前10條記錄,并希望按照用戶的創建時間排序 ,代碼如下: `$User->where('status=1')->order('create_time')->limit(10)->select();`這里的where、order和limit方法就被稱之為連貫操作方法,T除了select方法必須放到最后一個外(因為select方法并不是連貫操作方法),連貫操作T的方法調用順序沒有先后,例如,下面的代碼和上面的等效: `$User->order('create_time')->limit(10)->where('status=1')->select();`如果不習慣使用連貫操作的話,還支持直接使用參數進行查詢的方式。例如上面的代碼可以改寫為:`$User->select(array('order'=>'create_time','where'=>'status=1','limit'=>'10'));`使用數組參數方式的話,索引的名稱就是連貫操作的方法名稱。其實T不僅僅是查詢方法可以使用連貫操作,包括所有的CURD方法都可以使用,例如: `$User->where('id=1')->field('id,name,email')->find();?
$User->where('status=1?and?id=1')->delete();`連貫操作通常只有一個參數,并且僅在當此查詢或者操作有效,完成后會自動清空連貫操作的所有傳值(有個別特殊的連貫操作有多個參數,并且會記錄當前的傳值)。簡而言之,連貫操作的結果不會帶入以后的查詢。
系統支持的連貫操作方法有:
| 連貫操作 | 作用 | 支持的參數類型 |
|-----|-----|-----|
| where | 用于查詢或者更新條件的定義 | 字符串、數組和對象 |
| table | 用于定義要操作的數據表名稱 | 字符串和數組 |
| alias | 用于給當前數據表定義別名 | 字符串 |
| data | 用于新增或者更新數據之前的數據對象賦值 | 數組和對象 |
| field | 用于定義要查詢的字段(支持字段排除) | 字符串和數組 |
| order | 用于對結果排序 | 字符串和數組 |
| limit | 用于限制查詢結果數量 | 字符串和數字 |
| page | 用于查詢分頁(內部會轉換成limit) | 字符串和數字 |
| group | 用于對查詢的group支持 | 字符串 |
| having | 用于對查詢的having支持 | 字符串 |
| join* | 用于對查詢的join支持 | 字符串和數組 |
| union* | 用于對查詢的union支持 | 字符串、數組和對象 |
| distinct | 用于查詢的distinct支持 | 布爾值 |
| lock | 用于數據庫的鎖機制 | 布爾值 |
| cache | 用于查詢緩存 | 支持多個參數 |
| relation | 用于關聯查詢(需要關聯模型支持) | 字符串 |
所有的連貫操作都返回當前的模型實例對象(this),其中帶*標識的表示支持多次調用。
### WHERE
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">where 用于查詢或者更新條件的定義</th></tr><tr><td>用法</td> <td>where($where)</td> </tr><tr><td>參數</td> <td>where(必須):查詢或者操作條件,支持字符串、數組和對象</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>如果不調用where方法,默認不會執行更新和刪除操作</td> </tr></table>
Where方法是使用最多的連貫操作方法,更詳細的用法請參考后面的6.13 CURD操作和6.18查詢語言部分。
### TABLE
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">table??定義要操作的數據表名稱,動態改變當前操作的數據表名稱,需要寫數據表的全名,包含前綴,可以使用別名和跨庫操作</th> </tr><tr><td>用法</td> <td>table($table,$parse=null)</td> </tr><tr><td>參數</td> <td><p>table(必須):數據表名稱,支持操作多個表,支持字符串、數組和對象</p><p>parse(可選)預處理參數,詳見14.3防止SQL注入 查詢條件預處理</p></td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>如果不調用table方法,會自動獲取模型對應或者定義的數據表</td> </tr></table>
用法示例:`$Model->Table('think_user?user')->where('status>1')->select();`也可以在table方法中跨庫操作,例如:`$Model->Table('db_name.think_user?user')->where('status>1')->select();`Table方法的參數支持字符串和數組,數組方式的用法:`$Model->Table(array('think_user'=>'user','think_group'=>'group'))->where('status>1')->select();`使用數組方式定義的優勢是可以避免因為表名和關鍵字沖突而出錯的情況。
一般情況下,無需調用table方法,默認會自動獲取當前模型對應或者定義的數據表。
### DATA
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">data??可以用于新增或者保存數據之前的數據對象賦值</th> </tr><tr><td>用法</td> <td>data($data)</td> </tr><tr><td>參數</td> <td>data(必須):數據,支持數組和對象</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>如果不調用data方法,則會取當前的數據對象或者傳入add和save的數據</td> </tr></table>
使用示例:`$Model->data($data)->add();
$Model->data($data)->where('id=3')->save();`Data方法的參數支持對象和數組,如果是對象會自動轉換成數組。如果不定義data方法賦值,也可以使用create方法或者手動給數據對象賦值的方式。
模型的data方法除了創建數據對象之外,還可以讀取當前的數據對象,
例如:`$this->find(3);
$data?=?$this->data();`
### FIELD
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">field??用于定義要查詢的字段</th> </tr><tr><td>用法</td> <td>field($field,$except=false)</td> </tr><tr><td>參數</td> <td><p>field(必須):字段名,支持字符串和數組,支持指定字段別名;如果為true則表示顯式或者數據表的所有字段。</p><br/><p>except(可選):是否排除,默認為false,如果為true表示定義的字段為數據表中排除field參數定義之外的所有字段。</p></td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>如果不調用field方法,則默認返回所有字段,和field('*')等效</td> </tr></table>
使用示例:`$Model->field('id,nickname?as?name')->select();
$Model->field(array('id','nickname'=>'name'))->select();`如果不調用field方法或者field方法傳入參數為空的話,和使用field('*')是等效的。
如果需要顯式的傳入所有的字段,可以使用下面的方法:`$Model->field(true)->select();`但是我們更建議只獲取需要顯式的字段名,或者采用字段排除方式來定義,例如:`$Model->field('status',true)->select();`表示獲取除了status之外的所有字段。
### ORDER
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">order??用于對操作結果排序</th> </tr><tr><td>用法</td> <td>order($order)</td> </tr><tr><td>參數</td> <td>order(必須):排序的字段名,支持字符串和數組,支持多個字段排序</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>如果不調用order方法,按照數據庫的默認規則</td> </tr></table>
使用示例:`order('id?desc')?`排序方法支持對多個字段的排序`order('status?desc,id?asc')`order方法的參數支持字符串和數組,數組的用法如下:`order(array('status'=>'desc','id'))`
### LIMIT
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">limit??用于定義要查詢的結果限制(支持所有的數據庫類型)</th> </tr><tr><td>用法</td> <td>limit($limit)</td> </tr><tr><td>參數</td> <td>limit(必須):限制數量,支持字符串</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>如果不調用limit方法,則表示沒有限制</td> </tr></table>
備注 如果不調用limit方法,則表示沒有限制
我們知道不同的數據庫類型的limit用法是不盡相同的,但是在ThinkPHP的用法里面始終是統一的方法,也就是limit('offset,length') ,無論是Mysql、SqlServer還是Oracle數據庫,都是這樣使用,系統的數據庫驅動類會負責解決這個差異化。
使用示例:`limit('1,10')`如果使用limit('10') 等效于 limit('0,10')
3.1版本以后,limit方法增加第二個參數支持,例如:`$this->limit(10,100)->select();`和之前的用法`$this->limit('10,100')->select();`等效。
### PAGE
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">page??用于定義要查詢的數據分頁</th> </tr><tr><td>用法</td> <td>page($page)</td> </tr><tr><td>參數</td> <td>page(必須):分頁,支持字符串</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>無</td> </tr></table>
Page操作方法是新增的特性,可以更加快速的進行分頁查詢。
Page方法的用法和limit方法類似,格式為:`Page('page[,listRows]')`Page表示當前的頁數,listRows表示每頁顯示的記錄數。例如:`Page('2,10')`表示每頁顯示10條記錄的情況下面,獲取第2頁的數據。
listRow如果不寫的話,會讀取limit('length') 的值,例如:`limit(25)->page(3);`表示每頁顯示25條記錄的情況下面,獲取第3頁的數據。
如果limit也沒有設置的話,則默認為每頁顯示20條記錄。
3.1版本以后,page方法增加第二個參數支持,例如:`$this->page(5,25)->select();`和之前的用法`$this->page('5,25')->select();`等效。
### GROUP
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">group??用于數據庫的group查詢支持</th> </tr><tr><td>用法</td> <td>group($group)</td> </tr><tr><td>參數</td> <td>group(必須):group的字段名,支持字符串</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>無</td> </tr></table>
使用示例:`group('user_id')`Group方法的參數只支持字符串
### HAVING
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">having??用于數據庫的having查詢支持</th> </tr><tr><td>用法</td> <td>having($having)</td> </tr><tr><td>參數</td> <td>having(必須):having,支持字符串</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>無</td> </tr></table>
使用示例:`having('user_id>0')`having方法的參數只支持字符串
### JOIN
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">join??用于數據庫的join查詢支持</th> </tr><tr><td>用法</td> <td>join($join)</td> </tr><tr><td>參數</td> <td>join(必須):join操作,支持字符串和數組</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>join方法支持多次調用</td> </tr></table>
使用示例:`$Model->join('?work?ON?artist.id?=?work.artist_id')->join('card?ON?artist.card_id?=?card.id')->select();`默認采用LEFT JOIN 方式,如果需要用其他的JOIN方式,可以改成`$Model->join('RIGHT?JOIN?work?ON?artist.id?=?work.artist_id')->select();`如果join方法的參數用數組的話,只能使用一次join方法,并且不能和字符串方式混合使用。
例如:`join(array('?work?ON?artist.id?=?work.artist_id','card?ON?artist.card_id?=?card.id'))`
### UNION
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">union??用于數據庫的union查詢支持</th> </tr><tr><td>用法</td> <td>union($union,$all=false)</td> </tr><tr><td>參數</td> <td>union(必須):union操作,支持字符串、數組和對象<br/> all(可選):是否采用UNION?ALL?操作,默認為false</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>Union方法支持多次調用</td> </tr></table>
使用示例:`$Model->field('name')
??????->table('think_user_0')
??????->union('SELECT?name?FROM?think_user_1')
??????->union('SELECT?name?FROM?think_user_2')
??????->select();`數組用法:`$Model->field('name')
??????->table('think_user_0')
??????->union(array('field'=>'name','table'=>'think_user_1'))
??????->union(array('field'=>'name','table'=>'think_user_2'))
??????->select();`或者`$Model->field('name')
??????->table('think_user_0')
??????->union(array('SELECT?name?FROM?think_user_1','SELECT?name?FROM?think_user_2'))
??????->select();`支持UNION ALL 操作,例如:`$Model->field('name')
??????->table('think_user_0')
??????->union('SELECT?name?FROM?think_user_1',true)
??????->union('SELECT?name?FROM?think_user_2',true)
??????->select();`或者`$Model->field('name')
??????->table('think_user_0')
??????->union(array('SELECT?name?FROM?think_user_1','SELECT?name?FROM?think_user_2'),true)
??????->select();`每個union方法相當于一個獨立的SELECT語句。
注意:UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
### DISTINCT
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">distinct??查詢數據的時候進行唯一過濾</th> </tr><tr><td>用法</td> <td>distinct($distinct)</td> </tr><tr><td>參數</td> <td>distinct(必須):是否采用distinct,支持布爾值</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>無</td> </tr></table>
使用示例:`$Model->Distinct(true)->field('name')->select();`
### RELATION
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">relation??用于關聯查詢支持</th> </tr><tr><td>用法</td> <td>relation($relation)</td> </tr><tr><td>參數</td> <td>relation(必須):關聯操作</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>使用關聯模型才支持</td> </tr></table>
關聯查詢方法的詳細用法請參考后面的6.23關聯模型部分。
### LOCK
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">lock??用于查詢或者寫入鎖定</th> </tr><tr><td>用法</td> <td>lock($lock)</td> </tr><tr><td>參數</td> <td>lock(必須):是否需要鎖定,支持布爾值</td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>join方法支持多次調用</td> </tr></table>
Lock方法是用于數據庫的鎖機制,如果在查詢或者執行操作的時候使用:`lock(true)`就會自動在生成的SQL語句最后加上 FOR UPDATE或者FOR UPDATE NOWAIT(Oracle數據庫)。
### CACHE
<table border="0" cellspacing="1" cellpadding="0"><tr><th colspan="2">cache?用于查詢緩存操作</th> </tr><tr><td>用法</td> <td>cache($key=true,$expire='',$type='')</td> </tr><tr><td>參數</td> <td><p>key(可選):是否啟用查詢緩存,支持布爾值和字符串,如果是字符串表示查詢緩存的緩存名</p><br/><p>expire(可選):查詢緩存的有效期,如果留空取系統默認的緩存有效期</p><br/><p>type(可選):查詢緩存的緩存類型,如果留空取系統默認的緩存類型</p></td> </tr><tr><td>返回值</td> <td>當前模型實例</td> </tr><tr><td>備注</td> <td>如果不調用field方法,則默認返回所有字段,和field('*')等效</td> </tr></table>
查詢緩存的詳細用法會在后面的12.6查詢緩存部分詳細描述。
[上一頁](# "上一頁")[下一頁](# "下一頁")
- 序言
- 1. 入門
- 1.1 簡介
- 1.2 基礎概念
- 1.3 獲取ThinkPHP
- 1.4 環境要求
- 1.5 許可協議
- 1.6 目錄結構
- 1.7 命名規范
- 1.8 MVC分層
- 1.9 CBD架構
- 1.10 特性概述
- 1.11 系統流程
- 1.12 開發流程
- 2. 入口
- 2.1 入口文件
- 2.2 項目目錄
- 2.3 部署目錄
- 2.4 項目編譯
- 2.5 調試模式
- 3. 配置
- 3.1 配置格式
- 3.2 慣例配置
- 3.3 項目配置
- 3.4 調試配置
- 3.5 分組配置
- 3.6 讀取配置
- 3.7 動態配置
- 3.8 擴展配置
- 4. 函數和類庫
- 4.1 函數庫
- 4.2 類庫
- 5. 控制器
- 5.1 URL模式
- 5.2 模塊和操作
- 5.3 定義控制器
- 5.4 空操作
- 5.5 空模塊
- 5.6 模塊分組
- 5.7 URL偽靜態
- 5.8 URL路由
- 5.9 URL重寫
- 5.10 URL生成
- 5.11 URL大小寫
- 5.12 前置和后置操作
- 5.13 跨模塊調用
- 5.14 頁面跳轉
- 5.15 重定向
- 5.16 獲取系統變量
- 5.17 判斷請求類型
- 5.18 獲取URL參數
- 5.19 AJAX返回
- 5.20 Action參數綁定
- 5.21 多層控制器支持
- 6. 模型
- 6.1 模型定義
- 6.2 模型實例化
- 6.3 字段定義
- 6.4 數據主鍵
- 6.5 屬性訪問
- 6.6 跨庫操作
- 6.7 連接數據庫
- 6.8 切換數據庫
- 6.9 分布式數據庫
- 6.10 創建數據
- 6.11 字段映射
- 6.12 連貫操作
- 6.13 CURD操作
- 6.14 ActiveRecord
- 6.15 自動驗證
- 6.16 命名范圍
- 6.17 自動完成
- 6.18 查詢語言
- 6.19 查詢鎖定
- 6.20 字段排除
- 6.21 事務支持
- 6.22 高級模型
- 6.23 視圖模型
- 6.24 關聯模型
- 6.25 Mongo模型
- 6.26 動態模型
- 6.27 虛擬模型
- 6.28 多層模型支持
- 7. 視圖
- 7.1 模板定義
- 7.2 模板賦值
- 7.3 模板輸出
- 7.4 模板替換
- 7.5 獲取內容
- 7.6 模板引擎
- 7.7 布局模板
- 8. 模板引擎
- 8.1 變量輸出
- 8.2 系統變量
- 8.3 使用函數
- 8.4 默認值輸出
- 8.5 使用運算符
- 8.6 內置標簽
- 8.7 包含文件
- 8.8 導入文件
- 8.9 Volist標簽
- 8.10 Foreach標簽
- 8.11 For標簽
- 8.12 Switch標簽
- 8.13 比較標簽
- 8.14 三元運算
- 8.15 范圍判斷標簽
- 8.16 Present標簽
- 8.17 Empty標簽
- 8.18 Defined標簽
- 8.19 Define標簽
- 8.20 Assign標簽
- 8.21 IF標簽
- 8.22 標簽嵌套
- 8.23 使用PHP代碼
- 8.24 模板布局
- 8.25 模板繼承
- 8.26 原樣輸出
- 8.27 模板注釋
- 8.28 引入標簽庫
- 8.29 修改定界符
- 8.30 避免JS混淆
- 9. 日志
- 9.1 日志級別
- 9.2 記錄方式
- 9.3 手動記錄
- 10. 錯誤
- 10.1 異常處理
- 10.2 異常模板
- 10.3 異常顯示
- 11. 調試
- 11.1 運行狀態
- 11.2 頁面Trace
- 11.3 調試方法
- 12. 緩存
- 12.1 緩存方式
- 12.2 動態緩存
- 12.3 緩存隊列
- 12.4 快捷緩存
- 12.5 快速緩存
- 12.6 查詢緩存
- 12.7 SQL解析緩存
- 12.8 靜態緩存
- 13. 擴展
- 13.1 行為擴展
- 13.2 類庫擴展
- 13.3 控制器擴展
- 13.4 模型擴展
- 13.5 驅動擴展
- 13.6 Widget擴展
- 13.7 模式擴展
- 13.8 引擎擴展
- 14. 安全
- 14.1 表單令牌
- 14.2 字段類型驗證
- 14.3 防止SQL注入
- 14.4 輸入過濾
- 14.5 上傳安全
- 14.6 防止XSS攻擊
- 14.7 其他安全建議
- 14.8 目錄安全文件
- 14.9 保護模板文件
- 15. 性能
- 15.1 關閉調試模式
- 15.2 開啟緩存
- 15.3 合并字段緩存
- 15.4 優化SQL
- 15.5 替換入口
- 15.6 前端優化
- 16. 部署
- 16.1 PATH_INFO支持
- 16.2 隱藏index.php
- 16.3 二級域名部署
- 16.4 定制錯誤頁面
- 16.5 設置時區
- 17. SAE支持
- 17.1 SAE介紹
- 17.2 獲取SAE
- 17.3 SAE開發
- 18. REST支持
- 18.1 REST介紹
- 18.2 REST模式
- 18.3 REST配置
- 18.4 REST路由
- 18.5 REST方法
- 19. 雜項
- 19.1 Session支持
- 19.2 Cookie支持
- 19.3 日期和時間
- 19.4 WML開發
- 19.5 多語言
- 19.6 數據分頁
- 19.7 文件上傳
- 19.8 驗證碼
- 19.9 圖片添加水印
- 19.10 IP獲取和定位
- 20. 附錄
- 20.1 常量參考
- 20.2 配置參考
- 20.3 關于升級
- 20.4 大事記
- 鳴謝
- 關于