ThinkPHP開發指南-模型之連貫操作

ThinkPHP2.0版本全面啓用模型類的連貫操作方法,可以有效的提高數據存取的代碼清晰度和開發效率。使用方面也比較簡單, 假如我們現在要查詢一個User表的滿足狀態爲1的前10條記錄,並希望按照用戶的創建時間排序 ,代碼如下:

PHP代碼

$User->where('status=1')->order('create_time')->limit(10)->select(); 

除了select方法必須放到最後一個外,其他的連貫操作的方法調用順序沒有先後,例如,下面的代碼和上面的等效:

PHP代碼

$User->order('create_time')->where('status=1')->limit(10)->select();

如果不習慣使用連貫操作的話,新版還支持直接使用參數進行查詢的方式。例如上面的代碼可以改寫爲:

PHP代碼

$User->select(array('order'=>'create_time', 'where'=>'status=1', 'limit'=>'10')); 

使用數組參數方式的話,索引的名稱就是連貫操作的方法名稱。其實不僅僅是查詢方法可以使用連貫操作,包括add、 save、delete等方法都可以使用,例如:

PHP代碼

$User->where('id=1')->field('id,name,email')->find();     

$User->where('status=1 and id=1')->delete();

原則上說,所有的連貫操作都只有一個參數,並且連貫操作的參數僅在當此查詢或者操作有效,完成後會自動清空連貫操作的所有傳值,簡而言之,連貫操作的結果不會帶入以後的查詢。下面總結下連貫操作的使用方法(更多的用法我們會在CURD操作的過程中詳細描述):

Where方法:用於查詢或者更新條件的定義.

Where方法的參數支持字符串、數組和對象。詳細的使用請參考後面的查詢語言部分。

Table方法:定義要操作的數據表名稱

可以動態改變當前操作的數據表名稱,需要寫數據表的全名,包含前綴,可以使用別名,例如:

PHP代碼

$Model->Table('think_user user')->where('status>1')->select();   

Table方法的參數支持字符串和數組,數組方式的用法:

PHP代碼

$Model->Table(array('think_user'=>'user','think_group'=>'group'))->where('status>1')->select();  

使用數組方式定義的優勢是可以避免因爲表名和關鍵字衝突而出錯的情況。如果不定義table方法,默認會自動獲取當前模型對應或者定義的數據表。

Data方法:數據對象賦值

可以用於新增或者保存數據之前的數據對象賦值,例如:

PHP代碼

$Model->data($data)->add();    

$Model->data($data)->where('id=3')->save();

Data方法的參數支持對象數組,如果是對象會自動轉換成數組。如果不定義data方法賦值,也可以使用create方法或者手動給數據對象賦值的方式。

Field方法:定義要查詢的字段

Field方法的參數支持字符串和數組,例如,

PHP代碼

$Model->field('id,nickname as name')->select();    

$Model->field(array('id','nickname'=>'name'))->select();

如果不使用field方法指定字段的話,默認和使用field('*')等效。

Order方法:結果排序 . 例如:

PHP代碼

order('id desc') 

排序方法支持對多個字段的排序

PHP代碼

order('status desc,id asc')

order方法的參數支持字符串和數組,數組的用法如下:

PHP代碼

order(array('status'=>'desc','id')) 

Limit方法:結果限制

我們知道不同的數據庫類型的limit用法是不盡相同的,但是在ThinkPHP的用法裏面始終是統一的方法,也就是limit('offset,length') ,無論是MysqlSqlServer還是Oracle數據庫,都是這樣使用,系統的數據庫驅動類會負責解決這個差異化。

例如

PHP代碼

limit('1,10') 

如果使用limit('10') 等效於 limit('0,10')

Page方法:查詢分頁

Page操作方法是新增的特性,可以更加快速的進行分頁查詢。Page方法的用法和limit方法類似,格式爲:

PHP代碼

Page('page[,listRows]') 

Page表示當前的頁數,listRows表示每頁顯示的記錄數。例如:Page('2,10') 表示每頁顯示10條記錄的情況下面,獲取第2頁的數據。listRow如果不寫的話,會讀取limit('length') 的值,例如:

PHP代碼

limit(25)->page(3); 

表示每頁顯示25條記錄的情況下面,獲取第3頁的數據。如果limit也沒有設置的話,則默認爲每頁顯示20條記錄。

Group方法:查詢Group支持 例如:group('user_id')

Group方法的參數只支持字符串

Having方法:查詢Having支持 例如:

PHP代碼

having('user_id>0'

having方法的參數只支持字符串

Join方法:查詢Join支持

Join方法的參數支持字符串和數組,並且join方法是連貫操作中唯一可以多次調用的方法。例如:

PHP代碼

$Model->join(' work ON artist.id = work.artist_id')->join('card ON artist.card_id = card.id')->select(); 

默認採用LEFT JOIN 方式,如果需要用其他的JOIN方式,可以改成

PHP代碼

$Model->join('RIGHT JOIN work ON artist.id = work.artist_id')->select();

如果join方法的參數用數組的話,只能使用一次join方法,並且不能和字符串方式混合使用.

PHP代碼

join(array(' work ON artist.id = work.artist_id','card ON artist.card_id = card.id'))

Distinct方法:查詢的Disiinct支持

查詢數據的時候進行唯一過濾

PHP代碼

$Model->Distinct(true)->select();

Relation方法:關聯查詢支持

關聯查詢方法的詳細用法請參考後面的關聯模型部分。

Lock方法:查詢鎖定

Lock方法是用於數據庫的鎖機制,如果在查詢或者執行操作的時候使用:

PHP代碼

ck(true) 

就會自動在生成的SQL語句最後加上 FOR UPDATE。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章