最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

thinkphp查詢,3.X 5.0方法(親試可行)

 更新時間:2017年06月17日 08:40:38   投稿:jingxian  
下面小編就為大家?guī)硪黄猼hinkphp查詢,3.X 5.0方法(親試可行)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、介紹

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

二、查詢方式

ThinkPHP可以支持直接使用字符串作為查詢條件,但是大多數(shù)情況推薦使用索引數(shù)組或者對象來作為查詢條件,因為會更加安全。

1.使用字符串作為查詢條件

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

<?php 
$User = M("User"); // 實例化User對象 
$User->where('type=1 AND status=1')->select(); 
?>

最后生成的SQL語句是

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

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

2.使用數(shù)組作為查詢條件

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

<?php 
$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

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

<?php 
$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'

3.使用對象方式來查詢

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

<?php 
$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

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

三、表達(dá)式查詢

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

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

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

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

示例如下:

1.EQ :等于(=)

例如:$map['id'] = array('eq',100);和下面的查詢等效 $map['id'] = 100;表示的查詢條件就是 id = 100

2.NEQ: 不等于(<>)

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

3.GT:大于(>)

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

4.EGT:大于等于(>=)

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

5.LT:小于(<)

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

6.ELT: 小于等于(<=)

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

7.[NOT] LIKE: 同sql的LIKE

例如:$map['name'] = array('like','thinkphp%');查詢條件就變成 name like 'thinkphp%'

如果配置了DB_LIKE_FIELDS參數(shù)的話,某些字段也會自動進(jìn)行模糊查詢。例如設(shè)置了: 'DB_LIKE_FIELDS'=>'title|content'的話,使用 $map['title'] = 'thinkphp';查詢條件就會變成 name 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')

8.[NOT] BETWEEN :同sql的[not] between, 查詢條件支持字符串或者數(shù)組,

例如: $map['id'] = array('between','1,8');和下面的等效: $map['id'] = array('between',array('1','8'));

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

9.[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)

10.EXP:表達(dá)式,支持更復(fù)雜的查詢情況

例如:$map['id'] = array('in','1,3,8');可以改成: $map['id'] = array('exp',' IN (1,3,8) ');

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

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

四、快捷查詢

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

1.實現(xiàn)不同字段相同的查詢條件

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

查詢條件就變成

name= 'thinkphp' OR title = 'thinkphp'

2.實現(xiàn)不同字段不同的查詢條件

<?php 
$User = M("User"); // 實例化User對象 
$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'

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

五、區(qū)間查詢

ThinkPHP支持對某個字段的區(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)

最后一個可以是AND、 OR或者 XOR運(yùn)算符,如果不寫,默認(rèn)是AND運(yùn)算。


區(qū)間查詢的條件可以支持普通查詢的所有表達(dá)式,也就是說類似LIKE、GT和EXP這樣的表達(dá)式都可以支持。另外區(qū)間查詢還可以支持更多的條件,只要是針對一個字段的條件都可以寫到一起,例如:

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

六、組合查詢

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

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

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

<?php 
$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 )

2.請求字符串查詢方式

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

<?php 
$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)于封裝了一個新的查詢條件,然后并入原來的查詢條件之中,所以可以完成比較復(fù)雜的查詢條件組裝。

例如:

<?php 
$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作為子查詢條件來定義,配合之前的查詢方式,可以非常靈活的制定更加復(fù)雜的查詢條件。

很多查詢方式可以相互轉(zhuǎn)換,例如上面的查詢條件可以改成:

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

最后生成的SQL語句是一致的。

八、統(tǒng)計查詢

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

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

用法示例:

$User = M("User"); // 實例化User對象

獲取用戶數(shù): $userCount = $User->count();

或者根據(jù)字段統(tǒng)計: $userCount = $User->count("id");

獲取用戶的最大積分: $maxScore = $User->max('score');

獲取積分大于0的用戶的最小積分: $minScore = $User->where('score>0')->min('score');

獲取用戶的平均積分: $avgScore = $User->avg('score');

統(tǒng)計用戶的總成績: $sumScore = $User->sum('score');

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

九、SQL查詢

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

1.query方法 :執(zhí)行SQL查詢操作

用法 query($sql,$parse=false)

參數(shù) sql(必須):要查詢的SQL語句

parse(可選):是否需要解析SQL

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

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

使用示例:

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

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

2.execute方法 :execute用于更新和寫入數(shù)據(jù)的sql操作

用法 execute($sql,$parse=false)

參數(shù) sql(必須):要執(zhí)行的SQL語句

parse(可選):是否需要解析SQL

返回值 如果數(shù)據(jù)非法或者查詢錯誤則返回false 否則返回影響的記錄數(shù)

使用示例:

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

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

十、動態(tài)查詢

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

getBy 根據(jù)字段的值查詢數(shù)據(jù) 例如,getByName,getByEmail
getFieldBy 根據(jù)字段查詢并返回某個字段的值 例如,getFieldByName

1.getBy動態(tài)查詢:該查詢方式針對數(shù)據(jù)表的字段進(jìn)行查詢記錄。

例如,User對象擁有id,name,email,address 等屬性,那么我們就可以使用下面的查詢方法來直接根據(jù)某個屬性來查詢符合條件的記錄。

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

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

2.getFieldBy動態(tài)查詢:針對某個字段查詢并返回某個字段的值,例如

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

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

十一、子查詢

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

1、使用select方法

當(dāng)select方法的參數(shù)為false的時候,表示不進(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ù)的時候,表示不執(zhí)行當(dāng)前查詢,而只是生成查詢SQL。

2、使用buildSql方法

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

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

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

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

以上這篇thinkphp查詢,3.X 5.0方法(親試可行)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 學(xué)習(xí)php設(shè)計模式 php實現(xiàn)備忘錄模式(Memento)

    學(xué)習(xí)php設(shè)計模式 php實現(xiàn)備忘錄模式(Memento)

    這篇文章主要介紹了php設(shè)計模式中的備忘錄模式,使用php實現(xiàn)備忘錄模式,感興趣的小伙伴們可以參考一下
    2015-12-12
  • php strlen mb_strlen計算中英文混排字符串長度

    php strlen mb_strlen計算中英文混排字符串長度

    在php中常見的計算字符串長度的函數(shù)有:strlen和mb_strlen,下面是對這兩個函數(shù)的比較說明(編碼方式UTF8)
    2009-07-07
  • PHP $_FILES中error返回值詳解

    PHP $_FILES中error返回值詳解

    用PHP上傳文件時,我們會用程序去監(jiān)聽瀏覽器發(fā)送過來的文件信息,首先會通 過$_FILES[fieldName]['error']的不同數(shù)值來判斷此欲上傳的文件狀態(tài)是否正常。$_FILES[fieldName] ['error']==0代表一切正常,其它數(shù)值的具體含義請參考下面一段程序的注釋部分,如有翻譯不到之處還望指正
    2014-01-01
  • PHP中錯誤與異常的日志記錄用法分析

    PHP中錯誤與異常的日志記錄用法分析

    這篇文章主要介紹了PHP中錯誤與異常的日志記錄用法,較為詳細(xì)的分析了php中錯誤與異常的區(qū)別以及日志記錄的相應(yīng)使用技巧,需要的朋友可以參考下
    2016-08-08
  • php插入含有特殊符號數(shù)據(jù)的處理方法

    php插入含有特殊符號數(shù)據(jù)的處理方法

    當(dāng)我們需要利用php插入含有特殊符號數(shù)據(jù)的時候,會發(fā)現(xiàn)數(shù)據(jù)無法正常插入,那么這個時候該如何解決呢?最近在工作就遇到了這個問題,于是通過查找資料也得以解決了,現(xiàn)在將處理的方法分享給大家,有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • PHP微信支付功能示例

    PHP微信支付功能示例

    這篇文章主要介紹了PHP微信支付功能,結(jié)合實例形式分析了php微信支付功能相關(guān)sdk與使用技巧,需要的朋友可以參考下
    2019-03-03
  • 基于PHP RSA密文過長加密解密 越過1024的解決方法

    基于PHP RSA密文過長加密解密 越過1024的解決方法

    下面小編就為大家分享一篇基于PHP RSA密文過長加密解密 越過1024的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • php 運(yùn)行效率總結(jié)(提示程序速度)

    php 運(yùn)行效率總結(jié)(提示程序速度)

    php 效率總結(jié),有助于提高程序開發(fā)執(zhí)行效率。
    2009-11-11
  • php獲取apk包信息的方法

    php獲取apk包信息的方法

    這篇文章主要介紹了php獲取apk包信息的方法,非常實用的功能,需要的朋友可以參考下
    2014-08-08
  • PHP實現(xiàn)的簡單組詞算法示例

    PHP實現(xiàn)的簡單組詞算法示例

    這篇文章主要介紹了PHP實現(xiàn)的簡單組詞算法,涉及php針對字符串的遍歷、遞歸、組合、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04

最新評論

左云县| 迭部县| 石河子市| 马尔康县| 鹤岗市| 中山市| 株洲市| 渭源县| 海门市| 富民县| 平山县| 鹤山市| 镇坪县| 哈巴河县| 江津市| 渭南市| 弋阳县| 广安市| 宜君县| 辽中县| 夏邑县| 金平| 广灵县| 合阳县| 浦县| 固原市| 翼城县| 青海省| 张掖市| 景谷| 互助| 湛江市| 长治市| 鄄城县| 绥棱县| 美姑县| 宜兴市| 天等县| 卓尼县| 阿巴嘎旗| 泾阳县|