多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > ThinkPHP > ThinkPHP3.1快速入門(3)查詢語言

ThinkPHP3.1快速入門(3)查詢語言

來源:程序員人生   發布時間:2014-05-18 00:57:40 閱讀次數:3644次
上一篇中我們掌握了基本的數據CURD方法,但更多的情況下面,由于業務邏輯的差異,CURD操作往往不是那么簡單,尤其是復雜的業務邏輯下面,這也是ActiveRecord模式的不足之處。ThinkPHP的查詢語言配合連貫操作可以很好解決復雜的業務邏輯需求,本篇我們就首先來深入了解下框架的查詢語言。

介紹

ThinkPHP內置了非常靈活的查詢方法,可以快速的進行數據查詢操作,查詢條件可以用于讀取、更新和刪除等操作,主要涉及到where方法等連貫操作即可,無論是采用什么數據庫,你幾乎采用一樣的查詢方法(個別數據庫例如Mongo在表達式查詢方面會有所差異),系統幫你解決了不同數據庫的差異性,因此我們把框架的這一查詢方式稱之為查詢語言。查詢語言也是ThinkPHP框架的ORM亮點,讓查詢操作更加簡單易懂。下面來一一講解查詢語言的內涵。

查詢方式

ThinkPHP可以支持直接使用字符串作為查詢條件,但是大多數情況推薦使用索引數組或者對象來作為查詢條件,因為會更加安全。
一、使用字符串作為查詢條件
這是最傳統的方式,但是安全性不高,例如:
$User = M("User"); // 實例化User對象
$User->where('type=1 AND status=1')->select(); 
最后生成的SQL語句是
SELECT * FROM think_user WHERE type=1 AND status=1
采用字符串查詢的時候,我們可以配合使用新版提供的字符串條件的安全預處理機制,暫且不再細說。
二、使用數組作為查詢條件
這種方式是最常用的查詢方式,例如:
$User = M("User"); // 實例化User對象
$condition['name'] = 'thinkphp';
$condition['status'] = 1;
// 把查詢條件傳入查詢方法
$User->where($condition)->select(); 
最后生成的SQL語句是
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
如果進行多字段查詢,那么字段之間的默認邏輯關系是 邏輯與 AND,但是用下面的規則可以更改默認的邏輯判斷,通過使用 _logic 定義查詢邏輯:
$User = M("User"); // 實例化User對象
$condition['name'] = 'thinkphp';
$condition['account'] = 'thinkphp';
$condition['_logic'] = 'OR';
// 把查詢條件傳入查詢方法
$User->where($condition)->select(); 
最后生成的SQL語句是
SELECT * FROM think_user WHERE `name`='thinkphp' OR `account`='thinkphp'
三、使用對象方式來查詢
這里以stdClass內置對象為例:
$User = M("User"); // 實例化User對象
// 定義查詢條件
$condition = new stdClass(); 
$condition->name = 'thinkphp'; 
$condition->status= 1; 
$User->where($condition)->select(); 
最后生成的SQL語句和上面一樣
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
使用對象方式查詢和使用數組查詢的效果是相同的,并且是可以互換的,大多數情況下,我們建議采用數組方式更加高效。

表達式查詢

上面的查詢條件僅僅是一個簡單的相等判斷,可以使用查詢表達式支持更多的SQL查詢語法,也是ThinkPHP查詢語言的精髓,查詢表達式的使用格式:
$map['字段名'] = array('表達式','查詢條件');
表達式不分大小寫,支持的查詢表達式有下面幾種,分別表示的含義是:
表達式 含義
EQ 等于(=)
NEQ 不等于(<>)
GT 大于(>)
EGT 大于等于(>=)
LT 小于(<)
ELT 小于等于(<=)
LIKE 模糊查詢
[NOT] BETWEEN (不在)區間查詢
[NOT] IN (不在)IN 查詢
EXP 表達式查詢,支持SQL語法
示例如下:
EQ :等于(=)
例如:
$map['id']  = array('eq',100);
和下面的查詢等效
$map['id']  = 100;
表示的查詢條件就是 id = 100

NEQ: 不等于(<>)
例如:
$map['id']  = array('neq',100);
表示的查詢條件就是 id <> 100

GT:大于(>)
例如:
$map['id']  = array('gt',100);
表示的查詢條件就是 id > 100

EGT:大于等于(>=)
例如:
$map['id']  = array('egt',100);
表示的查詢條件就是 id >= 100

LT:小于(<)
例如:
$map['id']  = array('lt',100);
表示的查詢條件就是 id < 100

ELT: 小于等于(<=)
例如:
$map['id']  = array('elt',100);
表示的查詢條件就是 id <= 100

[NOT] LIKE: 同sql的LIKE
例如:
$map['name'] = array('like','thinkphp%');
查詢條件就變成 name like 'thinkphp%'
如果配置了DB_LIKE_FIELDS參數的話,某些字段也會自動進行模糊查詢。例如設置了:
'DB_LIKE_FIELDS'=>'title|content'
的話,使用
$map['title'] = 'thinkphp';
查詢條件就會變成 title like '%thinkphp%'
支持數組方式,例如
$map['a'] =array('like',array('%thinkphp%','%tp'),'OR');
$map['b'] =array('notlike',array('%thinkphp%','%tp'),'AND');
生成的查詢條件就是:
(a like '%thinkphp%' OR a like '%tp') AND (b not like '%thinkphp%' AND b not like '%tp')
[NOT] BETWEEN :同sql的[not] between, 查詢條件支持字符串或者數組,例如:
$map['id']  = array('between','1,8');
和下面的等效:
$map['id']  = array('between',array('1','8'));
查詢條件就變成 id BETWEEN 1 AND 8

[NOT] IN: 同sql的[not] in ,查詢條件支持字符串或者數組,例如:
$map['id']  = array('not in','1,5,8');
和下面的等效:
$map['id']  = array('not in',array('1','5','8'));
查詢條件就變成 id NOT IN (1,5, 8)
EXP:表達式,支持更復雜的查詢情況
例如:
$map['id']  = array('in','1,3,8');
可以改成:
$map['id']  = array('exp',' IN (1,3,8) ');
exp查詢的條件不會被當成字符串,所以后面的查詢條件可以使用任何SQL支持的語法,包括使用函數和字段名稱。查詢表達式不僅可用于查詢條件,也可以用于數據更新,例如:
$User = M("User"); // 實例化User對象
// 要修改的數據對象屬性賦值
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');// 用戶的積分加1
$User->where('id=5')->save($data); // 根據條件保存修改的數據

快捷查詢

從3.0版本開始,增加了快捷查詢方式,可以進一步簡化查詢條件的寫法,例如:
一、實現不同字段相同的查詢條件
$User = M("User"); // 實例化User對象
$map['name|title'] = 'thinkphp';
// 把查詢條件傳入查詢方法
$User->where($map)->select(); 
查詢條件就變成
name= 'thinkphp' OR title = 'thinkphp'
二、實現不同字段不同的查詢條件
$User = M("User"); // 實例化User對象
$map['status&title'] =array('1','thinkphp','_multi'=>true);
// 把查詢條件傳入查詢方法
$User->where($map)->select(); 
'_multi'=>true必須加在數組的最后,表示當前是多條件匹配,這樣查詢條件就變成
status= 1 AND title = 'thinkphp'
,查詢字段支持更多的,例如:
$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);
查詢條件就變成
status= 1 AND score >0 AND  title = 'thinkphp'
注意:快捷查詢方式中“|”和“&”不能同時使用。

區間查詢

ThinkPHP支持對某個字段的區間查詢,例如:
$map['id'] = array(array('gt',1),array('lt',10)) ;
得到的查詢條件是:
(`id` > 1) AND (`id` < 10)
$map['id'] = array(array('gt',3),array('lt',10), 'or') ;
得到的查詢條件是: (`id` > 3) OR (`id` < 10)
$map['id']  = array(array('neq',6),array('gt',3),'and'); 
得到的查詢條件是:(`id` != 6) AND (`id` > 3)
最后一個可以是AND、 OR或者 XOR運算符,如果不寫,默認是AND運算。
區間查詢的條件可以支持普通查詢的所有表達式,也就是說類似LIKE、GT和EXP這樣的表達式都可以支持。另外區間查詢還可以支持更多的條件,只要是針對一個字段的條件都可以寫到一起,例如:
$map['name']  = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), 'ThinkPHP','or'); 
最后的查詢條件是:
(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')

組合查詢

組合查詢的主體還是采用數組方式查詢,只是加入了一些特殊的查詢支持,包括字符串模式查詢(_string)、復合查詢(_complex)、請求字符串查詢(_query),混合查詢中的特殊查詢每次查詢只能定義一個,由于采用數組的索引方式,索引相同的特殊查詢會被覆蓋。
一、字符串模式查詢(采用_string 作為查詢條件)
數組條件還可以和字符串條件混合使用,例如:
$User = M("User"); // 實例化User對象
$map['id'] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select(); 
最后得到的查詢條件就成了:
( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )
二、請求字符串查詢方式
請求字符串查詢是一種類似于URL傳參的方式,可以支持簡單的條件相等判斷。
$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';
得到的查詢條件是:
`id`>100 AND (`status` = '1' OR `score` = '100')
三、復合查詢
復合查詢相當于封裝了一個新的查詢條件,然后并入原來的查詢條件之中,所以可以完成比較復雜的查詢條件組裝。
例如:
$where['name']  = array('like', '%thinkphp%');
$where['title']  = array('like','%thinkphp%');
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['id']  = array('gt',1);
查詢條件是
( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
復合查詢使用了_complex作為子查詢條件來定義,配合之前的查詢方式,可以非常靈活的制定更加復雜的查詢條件。
很多查詢方式可以相互轉換,例如上面的查詢條件可以改成:
$where['id'] = array('gt',1);
$where['_string'] = ' (name like "%thinkphp%")  OR ( title like "%thinkphp") ';
最后生成的SQL語句是一致的。

統計查詢

在應用中我們經常會用到一些統計數據,例如當前所有(或者滿足某些條件)的用戶數、所有用戶的最大積分、用戶的平均成績等等,ThinkPHP為這些統計操作提供了一系列的內置方法,包括:
方法 說明
Count 統計數量,參數是要統計的字段名(可選)
Max 獲取最大值,參數是要統計的字段名(必須)
Min 獲取最小值,參數是要統計的字段名(必須)
Avg 獲取平均值,參數是要統計的字段名(必須)
Sum 獲取總分,參數是要統計的字段名(必須)
用法示例:
$User = M("User"); // 實例化User對象
獲取用戶數:
$userCount = $User->count();
或者根據字段統計:
$userCount = $User->count("id");
獲取用戶的最大積分:
$maxScore = $User->max('score');
獲取積分大于0的用戶的最小積分:
$minScore = $User->where('score>0')->min('score');
獲取用戶的平均積分:
$avgScore = $User->avg('score');
統計用戶的總成績:
$sumScore = $User->sum('score');
并且所有的統計查詢均支持連貫操作的使用。

SQL查詢

ThinkPHP內置的ORM和ActiveRecord模式實現了方便的數據存取操作,而且新版增加的連貫操作功能更是讓這個數據操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查詢和執行操作支持,為了滿足復雜查詢的需要和一些特殊的數據操作,SQL查詢的返回值因為是直接返回的Db類的查詢結果,沒有做任何的處理。主要包括下面兩個方法:
1、query方法
query??執行SQL查詢操作
用法 query($sql,$parse=false)
參數 sql(必須):要查詢的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)
參數 sql(必須):要執行的SQL語句
parse(可選):是否需要解析SQL
返回值 如果數據非法或者查詢錯誤則返回false
否則返回影響的記錄數
使用示例:
$Model = new Model() // 實例化一個model對象 沒有對應任何數據表
$Model->execute("update think_user set name='thinkPHP' where status=1");
如果你當前采用了分布式數據庫,并且設置了讀寫分離的話,execute方法始終是在寫服務器執行,因此execute方法對應的都是寫操作,而不管你的SQL語句是什么。

動態查詢

借助PHP5語言的特性,ThinkPHP實現了動態查詢,核心模型的動態查詢方法包括下面幾種:
方法名 說明 舉例
getBy 根據字段的值查詢數據 例如,getByName,getByEmail
getFieldBy 根據字段查詢并返回某個字段的值 例如,getFieldByName
一、getBy動態查詢
該查詢方式針對數據表的字段進行查詢。例如,User對象擁有id,name,email,address 等屬性,那么我們就可以使用下面的查詢方法來直接根據某個屬性來查詢符合條件的記錄。
$user = $User->getByName('liu21st');
$user = $User->getByEmail('liu21st@gmail.com');
$user = $User->getByAddress('中國深圳');
暫時不支持多數據字段的動態查詢方法,請使用find方法和select方法進行查詢。
二、getFieldBy動態查詢
針對某個字段查詢并返回某個字段的值,例如
$userId = $User->getFieldByName('liu21st','id');
表示根據用戶的name獲取用戶的id值。

子查詢

從3.0版本開始新增了子查詢支持,有兩種使用方式:
1、使用select方法
當select方法的參數為false的時候,表示不進行查詢只是返回構建SQL,例如:
// 首先構造子查詢SQL 
$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('status')->select(false); 
當select方法傳入false參數的時候,表示不執行當前查詢,而只是生成查詢SQL。
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可用于ThinkPHP的連貫操作方法,例如table where等。

總結

本篇主要幫助我們了解如何進行數據的查詢,包括簡單查詢、表達式查詢、快捷查詢、區間查詢、統計查詢,以及如何進行子查詢操作。后面我們還會詳細了解如何使用連貫操作進行更復雜的CURD操作。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲国产精品综合福利专区 | 九色九色九色在线综合888 | 国产精品一区三区 | 波多野结衣 一区二区 | 国产美女无遮挡免费视频网站 | 18videosex性欧美69 | 欧美另类hd | h免费视频| 亚洲欧美激情在线 | 国产一级一片免费播放i | 欧美一级视频免费 | 久久婷五月天 | 国产一级淫片视频免费看 | xxxxx性| 亚洲免费人成在线视频观看 | 中文字幕一区精品 | 手机看片福利永久 | 欧美一级毛片图 | 日本午夜大片a在线观看 | 久久久中文 | 91伊人久久大香线蕉 | 精品无码久久久久国产 | 欧美成人亚洲高清在线观看 | 欧美三级超在线视频 | 456亚洲人成在线播放网站 | 99成人精品 | 亚洲人视频在线观看 | 亚洲宅男天堂a在线 | 精品在线一区二区三区 | 黄色免费网站在线看 | 中文字幕精品一区二区精品 | 久久国产亚洲欧美日韩精品 | 精品国产日韩久久亚洲 | 在线视频国产一区 | 久久亚洲国产精品五月天 | 泰国一级毛片aaa下面毛多 | 中文字幕网站在线 | 成人免费久久精品国产片久久影院 | 26uuu色噜噜欧美在线播放 | 亚洲乱码一区二区三区在线观看 | 国产欧美自拍视频 |