ThinkPHP3.1中的查詢語(yǔ)言有哪些-創(chuàng)新互聯(lián)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)ThinkPHP3.1中的查詢語(yǔ)言有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)長(zhǎng)期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為雙城企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè),雙城網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

1.查詢語(yǔ)言介紹


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

2.查詢方式

ThinkPHP可以支持直接使用字符串作為查詢條件,但是大多數(shù)情況推薦使用索引數(shù)組或者對(duì)象來(lái)作為查詢條件,因?yàn)闀?huì)更加安全。

一、使用字符串作為查詢條件

這是最傳統(tǒng)的方式,但是安全性不高,例如:

$User = M("User"); // 實(shí)例化User對(duì)象
$User->where('type=1 AND status=1')->select();

最后生成的SQL語(yǔ)句是

SELECT * FROM think_user WHERE type=1 AND status=1

采用字符串查詢的時(shí)候,我們可以配合使用新版提供的字符串條件的安全預(yù)處理機(jī)制,暫且不再細(xì)說(shuō)。

二、使用數(shù)組作為查詢條件

這種方式是最常用的查詢方式,例如:

$User = M("User"); // 實(shí)例化User對(duì)象
$condition['name'] = 'thinkphp';
$condition['status'] = 1;
 // 把查詢條件傳入查詢方法
$User->where($condition)->select();

最后生成的SQL語(yǔ)句是

SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1

如果進(jìn)行多字段查詢,那么字段之間的默認(rèn)邏輯關(guān)系是 邏輯與 AND,但是用下面的規(guī)則可以更改默認(rèn)的邏輯判斷,通過(guò)使用 _logic 定義查詢邏輯:

$User = M("User"); // 實(shí)例化User對(duì)象
$condition['name'] = 'thinkphp';
$condition['account'] = 'thinkphp';
$condition['_logic'] = 'OR';
 // 把查詢條件傳入查詢方法
$User->where($condition)->select();

最后生成的SQL語(yǔ)句是

SELECT * FROM think_user WHERE `name`='thinkphp' OR `account`='thinkphp'

三、使用對(duì)象方式來(lái)查詢

這里以stdClass內(nèi)置對(duì)象為例:

$User = M("User"); // 實(shí)例化User對(duì)象
 // 定義查詢條件
$condition = new stdClass(); 
$condition->name = 'thinkphp'; 
$condition->status= 1; 
$User->where($condition)->select();

最后生成的SQL語(yǔ)句和上面一樣

SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1

使用對(duì)象方式查詢和使用數(shù)組查詢的效果是相同的,并且是可以互換的,大多數(shù)情況下,我們建議采用數(shù)組方式更加高效。

3.表達(dá)式查詢

上面的查詢條件僅僅是一個(gè)簡(jiǎn)單的相等判斷,可以使用查詢表達(dá)式支持更多的SQL查詢語(yǔ)法,也是ThinkPHP查詢語(yǔ)言的精髓,查詢表達(dá)式的使用格式:

$map['字段名'] = array('表達(dá)式','查詢條件');

表達(dá)式不分大小寫,支持的查詢表達(dá)式有下面幾種,分別表示的含義是:

表達(dá)式含義
EQ等于(=)
NEQ不等于(<>)
GT大于(>)
EGT大于等于(>=)
LT小于(<)
ELT小于等于(<=)
LIKE模糊查詢
[NOT] BETWEEN(不在)區(qū)間查詢
[NOT] IN(不在)IN 查詢
EXP表達(dá)式查詢,支持SQL語(yǔ)法


示例如下:

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參數(shù)的話,某些字段也會(huì)自動(dòng)進(jìn)行模糊查詢。例如設(shè)置了:

'DB_LIKE_FIELDS'=>'title|content'

的話,使用

$map['title'] = 'thinkphp';

查詢條件就會(huì)變成 title like '%thinkphp%'

支持?jǐn)?shù)組方式,例如

$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, 查詢條件支持字符串或者數(shù)組,例如:


$map['id'] = array('between','1,8');

和下面的等效:


$map['id'] = array('between',array('1','8'));

查詢條件就變成 id BETWEEN 1 AND 8

[NOT] IN: 同sql的[not] in ,查詢條件支持字符串或者數(shù)組,例如:


$map['id'] = array('not in','1,5,8');

和下面的等效:


$map['id'] = array('not in',array('1','5','8'));

查詢條件就變成 id NOT IN (1,5, 8)
EXP:表達(dá)式,支持更復(fù)雜的查詢情況
例如:


$map['id'] = array('in','1,3,8');

可以改成:


$map['id'] = array('exp',' IN (1,3,8) ');

exp查詢的條件不會(huì)被當(dāng)成字符串,所以后面的查詢條件可以使用任何SQL支持的語(yǔ)法,包括使用函數(shù)和字段名稱。查詢表達(dá)式不僅可用于查詢條件,也可以用于數(shù)據(jù)更新,例如:


$User = M("User"); // 實(shí)例化User對(duì)象
 // 要修改的數(shù)據(jù)對(duì)象屬性賦值
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');// 用戶的積分加1
$User->where('id=5')->save($data); // 根據(jù)條件保存修改的數(shù)據(jù)


4.快捷查詢

從3.0版本開始,增加了快捷查詢方式,可以進(jìn)一步簡(jiǎn)化查詢條件的寫法,例如:

一、實(shí)現(xiàn)不同字段相同的查詢條件

$User = M("User"); // 實(shí)例化User對(duì)象
$map['name|title'] = 'thinkphp';
 // 把查詢條件傳入查詢方法
$User->where($map)->select();

查詢條件就變成

name= 'thinkphp' OR title = 'thinkphp'

二、實(shí)現(xiàn)不同字段不同的查詢條件

$User = M("User"); // 實(shí)例化User對(duì)象
$map['status&title'] =array('1','thinkphp','_multi'=>true);
 // 把查詢條件傳入查詢方法
$User->where($map)->select();

'_multi'=>true必須加在數(shù)組的最后,表示當(dāng)前是多條件匹配,這樣查詢條件就變成


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'

注意:快捷查詢方式中“|”和“&”不能同時(shí)使用。

5.區(qū)間查詢

ThinkPHP支持對(duì)某個(gè)字段的區(qū)間查詢,例如:

$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)
最后一個(gè)可以是AND、 OR或者 XOR運(yùn)算符,如果不寫,默認(rèn)是AND運(yùn)算。
區(qū)間查詢的條件可以支持普通查詢的所有表達(dá)式,也就是說(shuō)類似LIKE、GT和EXP這樣的表達(dá)式都可以支持。另外區(qū)間查詢還可以支持更多的條件,只要是針對(duì)一個(gè)字段的條件都可以寫到一起,例如:


$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')


6.組合查詢

組合查詢的主體還是采用數(shù)組方式查詢,只是加入了一些特殊的查詢支持,包括字符串模式查詢(_string)、復(fù)合查詢(_complex)、請(qǐng)求字符串查詢(_query),混合查詢中的特殊查詢每次查詢只能定義一個(gè),由于采用數(shù)組的索引方式,索引相同的特殊查詢會(huì)被覆蓋。

一、字符串模式查詢(采用_string 作為查詢條件)

數(shù)組條件還可以和字符串條件混合使用,例如:

$User = M("User"); // 實(shí)例化User對(duì)象
$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 )

二、請(qǐng)求字符串查詢方式

請(qǐng)求字符串查詢是一種類似于URL傳參的方式,可以支持簡(jiǎn)單的條件相等判斷。

$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';

得到的查詢條件是:

`id`>100 AND (`status` = '1' OR `score` = '100')

三、復(fù)合查詢

復(fù)合查詢相當(dāng)于封裝了一個(gè)新的查詢條件,然后并入原來(lái)的查詢條件之中,所以可以完成比較復(fù)雜的查詢條件組裝。
例如:

$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%') )

復(fù)合查詢使用了_complex作為子查詢條件來(lái)定義,配合之前的查詢方式,可以非常靈活的制定更加復(fù)雜的查詢條件。
很多查詢方式可以相互轉(zhuǎn)換,例如上面的查詢條件可以改成:


$where['id'] = array('gt',1);
$where['_string'] = ' (name like "%thinkphp%") OR ( title like "%thinkphp") ';

最后生成的SQL語(yǔ)句是一致的。

7.統(tǒng)計(jì)查詢

在應(yīng)用中我們經(jīng)常會(huì)用到一些統(tǒng)計(jì)數(shù)據(jù),例如當(dāng)前所有(或者滿足某些條件)的用戶數(shù)、所有用戶的較大積分、用戶的平均成績(jī)等等,ThinkPHP為這些統(tǒng)計(jì)操作提供了一系列的內(nèi)置方法,包括:



方法說(shuō)明
Count統(tǒng)計(jì)數(shù)量,參數(shù)是要統(tǒng)計(jì)的字段名(可選)
Max獲取較大值,參數(shù)是要統(tǒng)計(jì)的字段名(必須)
Min獲取最小值,參數(shù)是要統(tǒng)計(jì)的字段名(必須)
Avg獲取平均值,參數(shù)是要統(tǒng)計(jì)的字段名(必須)
Sum獲取總分,參數(shù)是要統(tǒng)計(jì)的字段名(必須)

用法示例:

$User = M("User"); // 實(shí)例化User對(duì)象

獲取用戶數(shù):


$userCount = $User->count();

或者根據(jù)字段統(tǒng)計(jì):


$userCount = $User->count("id");

獲取用戶的較大積分:


$maxScore = $User->max('score');

獲取積分大于0的用戶的最小積分:


$minScore = $User->where('score>0')->min('score');

獲取用戶的平均積分:


$avgScore = $User->avg('score');

統(tǒng)計(jì)用戶的總成績(jī):


$sumScore = $User->sum('score');

并且所有的統(tǒng)計(jì)查詢均支持連貫操作的使用。

8.SQL查詢

ThinkPHP內(nèi)置的ORM和ActiveRecord模式實(shí)現(xiàn)了方便的數(shù)據(jù)存取操作,而且新版增加的連貫操作功能更是讓這個(gè)數(shù)據(jù)操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查詢和執(zhí)行操作支持,為了滿足復(fù)雜查詢的需要和一些特殊的數(shù)據(jù)操作,SQL查詢的返回值因?yàn)槭侵苯臃祷氐腄b類的查詢結(jié)果,沒有做任何的處理。主要包括下面兩個(gè)方法:

一、query方法



query  執(zhí)行SQL查詢操作
用法query($sql,$parse=false)
參數(shù)sql(必須):要查詢的SQL語(yǔ)句
 parse(可選):是否需要解析SQL
返回值

如果數(shù)據(jù)非法或者查詢錯(cuò)誤則返回false


 

否則返回查詢結(jié)果數(shù)據(jù)集(同select方法)

使用示例:


$Model = new Model() // 實(shí)例化一個(gè)model對(duì)象 沒有對(duì)應(yīng)任何數(shù)據(jù)表
$Model->query("select * from think_user where status=1");

如果你當(dāng)前采用了分布式數(shù)據(jù)庫(kù),并且設(shè)置了讀寫分離的話,query方法始終是在讀服務(wù)器執(zhí)行,因此query方法對(duì)應(yīng)的都是讀操作,而不管你的SQL語(yǔ)句是什么。
二、execute方法



execute用于更新和寫入數(shù)據(jù)的sql操作
用法execute($sql,$parse=false)
參數(shù)sql(必須):要執(zhí)行的SQL語(yǔ)句
 parse(可選):是否需要解析SQL
返回值如果數(shù)據(jù)非法或者查詢錯(cuò)誤則返回false 
 否則返回影響的記錄數(shù)


使用示例:


$Model = new Model() // 實(shí)例化一個(gè)model對(duì)象 沒有對(duì)應(yīng)任何數(shù)據(jù)表
$Model->execute("update think_user set name='thinkPHP' where status=1");

如果你當(dāng)前采用了分布式數(shù)據(jù)庫(kù),并且設(shè)置了讀寫分離的話,execute方法始終是在寫服務(wù)器執(zhí)行,因此execute方法對(duì)應(yīng)的都是寫操作,而不管你的SQL語(yǔ)句是什么。

9.動(dòng)態(tài)查詢

借助PHP5語(yǔ)言的特性,ThinkPHP實(shí)現(xiàn)了動(dòng)態(tài)查詢,核心模型的動(dòng)態(tài)查詢方法包括下面幾種:

方法名說(shuō)明舉例
getBy根據(jù)字段的值查詢數(shù)據(jù)例如,getByName,getByEmail
getFieldBy根據(jù)字段查詢并返回某個(gè)字段的值例如,getFieldByName

一、getBy動(dòng)態(tài)查詢

該查詢方式針對(duì)數(shù)據(jù)表的字段進(jìn)行查詢。例如,User對(duì)象擁有id,name,email,address 等屬性,那么我們就可以使用下面的查詢方法來(lái)直接根據(jù)某個(gè)屬性來(lái)查詢符合條件的記錄。


$user = $User->getByName('liu21st');
$user = $User->getByEmail('liu21st@gmail.com');
$user = $User->getByAddress('中國(guó)深圳');

暫時(shí)不支持多數(shù)據(jù)字段的動(dòng)態(tài)查詢方法,請(qǐng)使用find方法和select方法進(jìn)行查詢。

二、getFieldBy動(dòng)態(tài)查詢

針對(duì)某個(gè)字段查詢并返回某個(gè)字段的值,例如


$userId = $User->getFieldByName('liu21st','id');

表示根據(jù)用戶的name獲取用戶的id值。

10.子查詢

從3.0版本開始新增了子查詢支持,有兩種使用方式:

1、使用select方法

當(dāng)select方法的參數(shù)為false的時(shí)候,表示不進(jìn)行查詢只是返回構(gòu)建SQL,例如:


// 首先構(gòu)造子查詢SQL 
$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('status')->select(false);

當(dāng)select方法傳入false參數(shù)的時(shí)候,表示不執(zhí)行當(dāng)前查詢,而只是生成查詢SQL。

2、使用buildSql方法

$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('status')->buildSql();

調(diào)用buildSql方法后不會(huì)進(jìn)行實(shí)際的查詢操作,而只是生成該次查詢的SQL語(yǔ)句(為了避免混淆,會(huì)在SQL兩邊加上括號(hào)),然后我們直接在后續(xù)的查詢中直接調(diào)用。

// 利用子查詢進(jìn)行查詢 
$model->table($subQuery.' a')->where()->order()->select()

構(gòu)造的子查詢SQL可用于ThinkPHP的連貫操作方法,例如table where等。

上述就是小編為大家分享的ThinkPHP3.1中的查詢語(yǔ)言有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:ThinkPHP3.1中的查詢語(yǔ)言有哪些-創(chuàng)新互聯(lián)
本文地址:http://bm7419.com/article44/cedhhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、ChatGPT、軟件開發(fā)商城網(wǎng)站、網(wǎng)站導(dǎo)航、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)