標籤:des http 使用 strong io 資料 問題 cti
http://doc.thinkphp.cn/manual/query.html SQL查詢ThinkPHP內建的ORM和ActiveRecord模式實現了方便的資料存取操作,而且新版增加的連貫操作功能更是讓這個資料操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查詢和執行操作支援,為了滿足複雜查詢的需要和一些特殊的資料操作,SQL查詢的傳回值因為是直接返回的Db類的查詢結果,沒有做任何的處理。主要包括下面兩個方法:
1、query方法
| query 執行SQL查詢操作 |
| 用法 |
query($sql,$parse=false) |
| 參數 |
query(必須):要查詢的SQL語句
parse(可選):是否需要解析SQL |
| 傳回值 |
如果資料非法或者查詢錯誤則返回false
否則返回查詢結果資料集(同select方法) |
使用樣本:
- $Model = new Model() // 執行個體化一個model對象 沒有對應任何資料表
- $Model->query("select * from think_user where status=1");
如果你當前採用了分散式資料庫,並且設定了讀寫分離的話,query方法始終是在讀伺服器執行,因此query方法對應的都是讀操作,而不管你的SQL語句是什麼。 2、execute方法
| execute用於更新和寫入資料的sql操作 |
| 用法 |
execute($sql,$parse=false) |
| 參數 |
query(必須):要執行的SQL語句
parse(可選):是否需要解析SQL |
| 傳回值 |
如果資料非法或者查詢錯誤則返回false
否則返回影響的記錄數 |
使用樣本:
- $Model = new Model() // 執行個體化一個model對象 沒有對應任何資料表
- $Model->execute("update think_user set name=‘thinkPHP‘ where status=1");
如果你當前採用了分散式資料庫,並且設定了讀寫分離的話,execute方法始終是在寫伺服器執行,因此execute方法對應的都是寫操作,而不管你的SQL語句是什麼。 3、其他技巧
自動擷取當前表名
通常使用原生SQL需要手動加上當前要查詢的表名,如果你的表名以後會變化的話,那麼就需要修改每個原生SQL查詢的sql語句了,針對這個情況,系統還提供了一個小的技巧來協助解決這個問題。
例如:
- $model = M("User");
- $model->query(‘select * from __TABLE__ where status>1‘);
我們這裡使用了__TABLE__ 這樣一個字串,系統在解析的時候會自動替換成當前模型對應的表名,這樣就可以做到即使模型對應的表名有所變化,仍然不用修改原生的sql語句。
支援連貫操作和SQL解析
新版對query和execute兩個原生SQL操作方法增加第二個參數支援, 表示是否需要解析SQL (預設為false 表示直接執行sql ),如果設為true 則會解析SQL中的特殊字元串 (需要配合連貫操作)。
例如,支援 如下寫法:
- $model->table("think_user")
- ->where(array("name"=>"thinkphp"))
- ->field("id,name,email")
- ->query(‘select %FIELD% from %TABLE% %WHERE%‘,true);
其中query方法中的%FIELD%、%TABLE%和%WHERE%字串會自動替換為同名的連貫操作方法的解析結果SQL,支援的替換字串包括:
| 替換字串 |
對應連貫操作方法 |
| %FIELD% |
field |
| %TABLE% |
table |
| %DISTINCT% |
distinct |
| %WHERE% |
where |
| %JOIN% |
join |
| %GROUP% |
group |
| %HAVING% |
having |
| %ORDER% |
order |
| %LIMIT% |
limit |
| %UNION% |
union |
3動態查詢藉助PHP5語言的特性,ThinkPHP實現了動態查詢,包括下面幾種:
| 方法名 |
說明 |
舉例 |
| getBy |
根據某個欄位的值查詢資料 |
例如,getByName,getByEmail |
| getFieldBy |
根據某個欄位查詢並返回某個欄位的值 |
例如,getFieldByName |
| top |
擷取前多少條記錄(需要進階模型支援) |
例如,top8,top12 |
一、getBy動態查詢
該查詢方式針對資料表的欄位進行查詢。例如,User對象擁有id,name,email,address 等屬性,那麼我們就可以使用下面的查詢方法來直接根據某個屬性來查詢合格記錄。
- $user = $User->getByName(‘liu21st‘);
- $user = $User->getByEmail(‘[email protected]‘);
- $user = $User->getByAddress(‘中國深圳‘);
暫時不支援多資料欄位的動態查詢方法,請使用find方法和select方法進行查詢。 二、getFieldBy動態查詢
針對某個欄位查詢並返回某個欄位的值,例如
- $user = $User->getFieldByName(‘liu21st‘,‘id‘);
表示根據使用者的name擷取使用者的id值。 三、top動態查詢
ThinkPHP還提供了另外一種動態查詢方式,就是擷取合格前N條記錄(和定位查詢一樣,也要求當前模型類必須繼承進階模型類後才能使用)。例如,我們需要擷取目前使用者中積分大於0,積分最高的前5位使用者 :
- $User-> where(‘score>80‘)->order(‘score desc‘)->top5();
要擷取積分的前8位可以改成:
- $User-> where(‘score>80‘)->order(‘score desc‘)->top8();
5子查詢新版新增了子查詢支援,有兩種使用方式:
1、使用select方法
當select方法的參數為false的時候,表示不進行查詢只是返回構建SQL,例如:
- // 首先構造子查詢SQL
- $subQuery = $model->field(‘id,name‘)->table(‘tablename‘)->group(‘field‘)->where($where)->order(‘status‘)->select(false);
2、使用buildSql方法
- $subQuery = $model->field(‘id,name‘)->table(‘tablename‘)->group(‘field‘)->where($where)->order(‘status‘)->buildSql();
調用buildSql方法後不會進行實際的查詢操作,而只是產生該次查詢的SQL語句(為了避免混淆,會在SQL兩邊加上括弧),然後我們直接在後續的查詢中直接調用。
- // 利用子查詢進行查詢
- $model->table($subQuery.‘ a‘)->where()->order()->select()
構造的子查詢SQL可用於TP的連貫操作方法,例如table where等。