ThinkPHP3.1快速入門(4)連貫操作

黄舟
發布: 2023-03-03 17:02:02
原創
1278 人瀏覽過

上一篇我們詳細描述了查詢語言的用法,但是查詢語言僅僅解決了查詢或操作條件的問題,更多的配合還需要使用模型提供的連貫操作方法。

介紹

連貫操作可以有效的提高資料存取的程式碼清晰度和開發效率,並且支援所有的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)查詢語言。

TABLE

table  定義要操作的資料表名稱,動態變更目前作業的資料表名稱,需要寫入資料表的全名,包含前綴,可使用別名和跨庫操作

用法   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方法除了建立資料對象之外,還可以讀取目前的資料對象,
例如:

$this->find(3);

$data = $this->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();

表示取得除了status之外的所有欄位。

ORDER

order  用於對操作結果排序

用法   order($order)    

 回傳值   目前模型實例   

備註   如果不呼叫order方法,依照資料庫的預設規則   

使用範例:

order('id desc')order

使用範例:

order('id desc')order使用範例:

order('id desc')order

的排序方法來支援多個欄位

()對多個欄位

() desc,id asc')

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

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

LIMIT

limit  用來定義要查詢的結果限制(支援所有的資料庫類型)

用法   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')

等效於

limit('0,10')

PAGE

page 定義要查詢的資料分頁


 字串   

回傳值   目前模型實例   

備註   無   

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

Page('page[,listRows]')

Page表示目前的頁數,listRows表示每頁顯示的記錄數。例如:

Page('2,10')

表示每頁顯示10筆記錄的情況下面,取得第2頁的資料。

下面的寫法等效:

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方法的參數只支援字串

HAVING

havf

having )

參數   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方法的參數用數組的話,只能使用一次join方法,並且不能和字串方式混合使用。

例如:

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 操作,認為字串、陣列回傳值   目前模型實例   

備註   Union方法支援多次呼叫  ->union('SELECT name FROM think_user_1')

      ->union('SELECT name FROM think_user_2')

     

      ->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


distinct 查詢資料的時間進行唯一過濾

distinct 查詢資料的時間進行唯一過濾

用法   distinct($distinct)      目前模型實例   

備註無   

使用範例:

$Model->Distinct(true)->field('name')->select();

LOCK

lock 用來查詢或寫入使用lock($lock)    

參數   lock(必須):是否需要鎖定,支援布林值   

回傳值   目前模型實例   

備註查詢或執行操作的時候使用:

lock(true)

就會自動在產生的SQL語句最後加上FOR UPDATE或FOR UPDATE NOWAIT(Oracle資料庫)。

VALIDATE

validate 用於資料的自動驗證

用法   validate($validate)     

備註   只能和create方法搭配使用   

validate方法用於資料的自動驗證,我們會在資料驗證部分詳細描述。

AUTO

auto 用於資料自動完成

用法   auto($auto)    

備註   auto方法只能搭配create方法使用   

auto方法用於資料的自動完成操作,具體使用我們會在資料中自動完成部分描述。

SCOPE

scope 用於模型的命名範圍

用法   scope($scope)    

參數 定義值

備註   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)! 


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!