上一篇我們詳細描述了查詢語言的用法,但是查詢語言僅僅解決了查詢或操作條件的問題,更多的配合還需要使用模型提供的連貫操作方法。
介紹
連貫操作可以有效的提高資料存取的程式碼清晰度和開發效率,並且支援所有的CURD操作,也是ThinkPHP的ORM中的一個亮點。使用也比較簡單,假如我們現在要查詢一個User表的滿足狀態為1的前10筆記錄,並希望按照使用者的建立時間排序,程式碼如下:
$User->where('status=1') ->order('create_time')->limit(10)->select();
這裡的where、order和limit方法就稱為連貫操作方法,除了select方法必須放到最後一個外(因為select方法並不是連貫操作方法),連貫操作的方法呼叫順序沒有先後,例如,下面的程式碼和上面的等效:
$User->order('create_time')->limit(10)->where( 'status=1')->select();
其實不只是查詢方法可以使用連貫操作,包括所有的CURD方法都可以使用,例如:
$User->where('id=1') ->field('id,name,email')->find();
$User->where('status=1 and id=1')->delete();
連貫作業僅在當次查詢或操作有效,完成後會自動清空連貫運算的所有傳值(有個別特殊的連貫操作會記錄目前的傳值,如cache連貫操作)。簡而言之,連貫操作的結果不會帶入以後的查詢。
系統支援的連貫運算方法有:
方法
作用
支援的參數型別
where 的資料表名稱 字串與陣列
alias 用於為目前資料表定義別名 字串
data 用於新增或為更新資料之前的資料物件賦值支援欄位排除) 字串與陣列
order 用於對結果排序 字串與陣列
limit 與查詢結果碼數字
group 用於查詢的group支援 字串
having 用於查詢的having支援 字串 用於對查詢的union支援 字串、陣列和物件
distinct 用於查詢的distinct支援 布林值
lock 用於資料庫的鎖定機制
relation 用於關聯查詢(需要關聯模型擴充支援) 字串
validate 用於資料自動驗證 陣列
au 字串
scope* 用於命名範圍字串、陣列
所有的連貫運算都會傳回目前的模型實例物件(this),其中有*識別的表示支援多次呼叫。
用法
由於連貫操作的使用往往涉及到多個方法的聯合使用,下面大概介紹下各個連貫操作的基本用法:
WHERE
where 用於查詢或更新條件的定義
where 用於查詢或更新條件的定義
where 用於查詢或更新條件的定義
where 用於查詢或更新條件的定義
用法 where($where)
參數 where(必須):查詢或操作條件,支援字串、陣列與物件
註解操作
Where方法是使用最多的連貫操作方法,更詳細的用法請參考:快速入門(3)查詢語言。
TABLEtable 定義要操作的資料表名稱,動態變更目前作業的資料表名稱,需要寫入資料表的全名,包含前綴,可使用別名和跨庫操作
用法 table($table)
用法 table($table)
參數table(必須):資料表名稱,支援操作多個資料表,支援字串、陣列和物件
回傳值 目前模型實例
備註 若不呼叫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
data 可以用來新增或儲存資料之前的資料物件賦值
用法 data($data) 目前模型實例
備註 如果不呼叫data方法,則會取目前的資料物件或傳入add和save的資料
使用範例:
$Model->data($data)->
使用範例:$Model->data($data)->add(); $Model->data($data)->where('id=3')->save();Data方法的參數支援物件和數組,如果物件會自動轉換成數組。如果不定義data方法賦值,也可以使用create方法或手動為資料物件賦值的方式。
模型的data方法除了建立資料對象之外,還可以讀取目前的資料對象,
例如:
FIELD field 用於定義要查詢的欄位 用法 field($field,$except=false) 參數名稱,欄位別名;如果為true則表示明確或資料表的所有欄位。 except(可選):是否排除,預設為false,如果為true表示定義的欄位為資料表中排除field參數定義之外的所有欄位。 返回值 當前模型實例 備註 如果不調用field方法,則默認返回所有字段,和field('*')等效 如果不調用field方法,則默認返回所有字段,和field('*')等效 ,nickname as name')->select();$Model->field(array('id','nickname'=>'name'))->select();如果不呼叫field方法或者field方法傳入參數為空的話,和使用field('*')是等效的。
如果需要明確的傳入所有的字段,可以使用下面的方法:
$Model->field(true)->select();
但是我們更建議只獲取需要明確的字段名,或者採用欄位排除方式來定義,例如:
$Model->field('status',true)->select();
回傳值 目前模型實例
備註 如果不呼叫order方法,依照資料庫的預設規則
使用範例:
order('id desc')order
使用範例:order('id desc')order使用範例:order('id desc')order的排序方法來支援多個欄位()對多個欄位
() desc,id asc')order方法的參數支援字串和數組,數組的使用如下:order(array('status'=>'desc','id'))LIMITlimit 用來定義要查詢的結果限制(支援所有的資料庫類型)
用法 limit($limit)
參數 limit(必須):限制數量,支援字串如果不呼叫limit方法,則表示沒有限制
備註如果不呼叫limit方法,則表示沒有限制
我們知道不同的資料庫類型的limit用法是不盡相同的,但是在ThinkPHP的用法裡面始終是統一的方法,也就是limit('offset,length') ,無論是Mysql、SqlServer或Oracle資料庫,都是這樣使用,系統的資料庫驅動類別都會負責解決這個差異化。
使用範例:
limit('1,10')
也可以用下面的寫法,是等效的:
limit(1,10)
如果使用
limit('10')
如果使用
limit('10')
如果使用
limit('10')
如果使用
limit('10')
如果使用
limit('10')
如果使用
limit('10')
等效於
字串
回傳值 目前模型實例
備註 無
Page操作方法是新增的特性,且可以更快速的進行分頁查詢。
Page方法的用法和limit方法類似,格式為:
下面的寫法等效:
Page(2,10);
listRow如果不寫的話,會讀取limit('length') 的值,例如:
limit(25)->page(3) ;
表示每頁顯示25筆記錄的情況下面,取得第3頁的資料。
如果limit也沒有設定的話,則預設為每頁顯示20筆記錄。page方法增加第二個參數支持,例如:
$this->page(5,25)->select();
和之前的用法
$this->limit('5,25') ->select();
等效。
GROUP
group 用於資料庫的group查詢支援
用法 group($group)
N 備註 無 使用範例:group('user_id')Group方法的參數只支援字串HAVINGhavfhaving )
參數 having(必須):having,支援字串
回傳值 目前模型實例
備註 無註
JOIN
join 用於資料庫的join查詢支援
用法 join($join)
參數
備註join方法支援多次呼叫
使用範例:
$Model->join(' work ON artist.id = work.artist_id')->join('card ON artist.card_id ();
預設採用LEFT JOIN 方式,如果需要用其他的JOIN方式,可以改成
$Model->join('RIGHT JOIN work ON artist.id = work.artist_id')->select();
例如:
join(array(' work ON artist.id = work.artist_id','card ON artist.card_id = card.id'))
UNIONION
ion用法 union($union,$all=false) 參數 union(必須):union操作,並支援字串、陣列與物件
all(選用):是否有使用UNION ALL 操作,認為字串、陣列回傳值 目前模型實例
->table('think_user_0 ')
->union(array('field'=>'name','table'=>'think_user_1'))
->union(array('field'=>'name','table'=>'think_user_2'))
->select();
->select();
->select();
->table('think_user_0') ->將(array('SELECT name FROM think_user_1','SECTnamename&F) ) >select();支援UNION ALL 操作,例如:
$Model->field('name') ->table('think_user_0') ->Oion('SELECT name FROMo005FROM ('SELECT name FROM think_user_2',true ) ->select();或$Model->field('name') name FROM think_user_1',' SELECT name FROM think_user_2'),true) ->select();每個union方法相當於獨立的SELECT語句。
注意:UNION 內部的 SELECT 語句必須擁有相同數量的欄位。列也必須擁有相似的資料類型。同時,每條 SELECT 語句中的列的順序必須相同。
DISTINCT
參數 定義值
備註 scope方法其實是連貫操作的預定義
scope方法的具體用法可以參考:3.1的新特性命名範圍
FILTER
filter 用於數據的安全過濾
用法 filter($filter)
參數 filter(必須):濾波方法名稱
回傳值 目前模型實例
備註 filter方法一般用於寫入與更新作業
filter方法用於對資料物件的安全過濾,例如:datao+ )->filter('strip_tags')->add();
目前filter方法不支援多個方法的過濾。
總結
連貫操作為我們的資料操作帶來了很大的便捷之處,並且只要SQL可以實現的操作,基本上都可以用ThinkPHP的連貫操作來實現,並且不用考慮資料庫之間的表達差異,具有可移植性。後面會跟大家講解如何操作和取得變數。
以上就是ThinkPHP3.1快速入門(4)連貫操作的內容,更多相關內容請關注PHP中文網(www.php.cn)!