連貫操做是 ThinkPHP 極富特點的一大特性,在使用連貫操做進行數據庫操做時,就像玩遊戲搭積木同樣容易:嗯,程序編寫就應該如此簡潔而容易纔對。數據庫
連貫操做的一個例子:數組
$Dao = M("User"); // 查詢全部用戶數據 $allUser = $Dao->select(); // 查詢最近註冊的 10 個用戶並按照註冊時間排序 $newUser = $Dao->order('regdate DESC')->limit(10)->select();
上面查詢最近 10 個註冊用戶的例子中,select、order 和 limit 都是 Model 的內置方法,分別表示數據查詢、設置排序和查詢記錄限制。當把這些及更多的方法組合放在一塊兒的時候從而構建不一樣的數據庫操做(包括 CURD 全部操做)時,這種操做方式就叫連貫操做。ui
連貫操做主方法是指對數據庫的操做方法,例如 select(查詢)、find(查詢一條記錄)、getBy動態方法、add(寫入)、save(更新)、delect(刪除)等。注意:主方法這一稱謂並不是官方的稱呼,而是本教材爲了便於理解而定義的。spa
一個連貫操做中只容許出現一個主方法,且主方法必需要寫在連貫操做的最後。本教程對各主方法分別作了詳細介紹:對象
輔助方法即相對於上文的主方法而言,在連貫操做中輔助主方法實現各類數據庫操做條件,如上面例子中的 where、limit 等方法。排序
where 方法用於設定操做條件,詳細見:《ThinkPHP where方法》。教程
where 方法用於將查詢結果排序,支持單個或多個字段排序,參數支持字符串和數組:索引
// 單個字段 $allUser = $Dao->order('uid DESC')->select(); // 多個字段 $allUser = $Dao->order('regdate ASC,score DESC')->select(); // 參數爲數組 $allUser = $Dao->order(array('regdate'=>'ASC','score DESC'))->select();
limit 方法用於限制操做結果,對於不一樣的數據庫,ThinkPHP 將操做結果限制統一爲 limit 方法,語法以下:遊戲
limit('length')
若是使用 limit('10') 等效於 limit('0,10')。開發
定義要查詢的字段,參數支持字符串和數組:
$allUser = $Dao->field('username,email')->select(); // 使用數組參數 $allUser = $Dao->field(array('nickname'=>'name','email'))->select();
若是不使用 field 方法指定查詢字段,則等效爲 field('*')。
用於新增或者保存數據以前的數據對象賦值:
$data['email'] = 'Jack@163.com'; $Dao->data($data)->where('id=3')->save(); // 若是不定義data方法賦值,則能夠在主方法中傳入參數或者使用create數據對象: $Dao->where('id=3')->save($data);
data 方法的參數支持對象和數組,若是是對象會自動轉換成數組。
GROUP BY 語法支持,group 方法的參數只支持字符串:
$allUser = $Dao->group('regon')->select();
HAVING 語法支持,having 方法的參數只支持字符串:
$allUser = $Dao->having('score > 100')->select();
DISTINCT 語法支持,查詢數據的時候進行惟一過濾:
$allUser = $Dao->distinct('username')->select();
JOIN 語法支持,具體參見《ThinkPHP JOIN查詢》。
table 方法能夠動態改變當前操做的數據表名稱,須要寫數據表的全名(包含前綴),可使用別名:
$allUser = $Dao->table('my_user')->select();
table 方法參數除字符串外還支持數組:
$allUser = $Dao->table(array('my_user'=>'user','my_group'=>'group'))->select();
使用數組方式能夠避免由於表名和關鍵字衝突而出錯的狀況。若是不定義table方法,默認會自動獲取當前模型對應或者定義的數據表。
page方法用於查詢分頁,具體參見《ThinkPHP 分頁》。
lock 方法是用於數據庫的鎖機制:
$allUser = $Dao->lock(true)->select();
該例子會在生成的 SQL 語句最後加上 FOR UPDATE 。
與主方法不一樣的是,上述這些輔助方法能夠根據實際狀況自由組合,且順序沒有先後要求。
連貫操做中各方法的參數僅在當次操做有效,完成後會自動清空連貫操做的全部傳值,不會帶入之後的操做中。
若是不使用連貫操做,ThinkPHP 還支持直接使用參數進行查詢的方式。下面兩個查詢例子是等效的:
$newUser = $Dao->order('regdate DESC')->limit(10)->select(); $newUser = $Dao->select(array('order'=>'regdate DESC', 'limit'=>'10'));
如上例子所示,使用數組參數方式的話,索引的名稱就是連貫操做的方法名稱。
ThinkPHP 連貫操做有效的提升數據存取的代碼清晰度和開發效率,建議積極使用。