查詢方式
Thinkphp提供了三種基本的查詢方式:字符串條件查詢、索引數(shù)組條件查詢和對(duì)象條件查詢、在大多數(shù)情況下,推薦使用索引數(shù)組和對(duì)象方式為查詢條件,因?yàn)闀?huì)更加安全
1、使用字符串作為條件查詢
//字符串作為條件查詢
$user = M('User');
var_dump($user->where(' id = 1 AND user = “蠟筆小新” ')->select());
PS:where查詢方法里面只要包含條件即可,多個(gè)條件加上AND等鏈接符即可,我們會(huì)在SQL連貫操作詳細(xì)學(xué)習(xí)。
2、使用索引數(shù)組作為查詢條件
//索引數(shù)組作為條件查詢
$user = M('User');
$condition[' user '] = '蠟筆小新';
$condition[' id'] = '蠟筆小新';
var_dump($user->where($condition)->select());
PS:索引數(shù)查詢的默認(rèn)邏輯關(guān)系是AND,如果想改變?yōu)镺R,可以使用_logic定義查詢邏輯
基于上面的代碼增加如下一行:
$condition['_logic'] = 'OR' //將默認(rèn)AND改為OR
3、使用對(duì)象方式來(lái)查詢
//對(duì)象作為條件查詢
$user = M('User');
$condition = new \stdClass();
$condition->id = 1;
$condition->user = '蠟筆小新'
var_dump($user->where($condition)->select());
PS:stdClass類是PHP內(nèi)置的類,可以理解為一個(gè)空雷,在這里可以理解為把條件的字段作為成員保存在stdClass類里,而這里的‘\’是將命名空間設(shè)置為根目錄,否則會(huì)導(dǎo)致當(dāng)前目錄找不到次類。
PS:使用對(duì)象和數(shù)組查詢,效果是一樣的,可以互換,在大多數(shù)情況下,tinkPHP推薦使用數(shù)組形式更加高效
表達(dá)式查詢
對(duì)于那些藥實(shí)現(xiàn)模糊判斷的查詢,比如大于、等于、小于之類的SQL查詢,可以使用表達(dá)式查詢方式
查詢表達(dá)式格式:$map['字段名'] = array(' 表達(dá)式 ' , ‘ 查詢條件 ’);
表達(dá)式查詢表
表達(dá)式 含義
EQ 等于
NEQ 不等于
GT 大于
EGT 大于等于
LT 小于
ELT 小于等于
[NOT]LIKE 模糊查詢
[NOT]BETWEEN (不在)區(qū)間查詢
[NOT]IN (不在)IN查詢
EXP 表達(dá)式查詢,支持SQL語(yǔ)法
PS:表達(dá)式不區(qū)分大小寫
//查詢表達(dá)式:$map['字段名'] = array('表達(dá)式',"查詢條件");
$user = M('User');
//等于
$map['id'] = array('eq',1);//id這個(gè)字段 的值等于(eq)1
//不等于
$map['id'] = array('neq',1);//id這個(gè)字段 的值不等于(neq)1,這時(shí)候會(huì)查出所有id不等于1的值
//模糊查詢
$map['user'] = array('like','%小%');//模糊查詢user里面帶小字的
//模糊查詢的數(shù)組方式
$map['user'] = array('like' , array('%小%', '%臘%'), 'AND');//又包含小的 又包含臘的 如果不寫AND 那就當(dāng)是或了。會(huì)查出既包含小的,又包含臘的
//區(qū)間查詢
$map['id'] = array('between' , '1,3') //查詢id在1到3區(qū)間的條目
//區(qū)間查詢數(shù)組形式
$map['id'] = array('between', array('1','3'));//查詢id在1到3之間的條目
//區(qū)間查詢 不在范圍之內(nèi)的
$map['id'] = array('not between', '1,3');//查詢id 不在1到3的范圍之內(nèi)的所有元素
//IN區(qū)間查找
$map['id'] = array('in' , '1,2,4');//查詢id等于1,2,4的條目
//not IN 查找
$map['id'] = array('not in' , '1,2,4');//查詢id 不等于1,2,4的條目。
//小于查詢
$map['id'] = array('exp' , '<1');//查詢id
var_dump($user->where($map)->select());
快捷查詢
//快捷查詢方式是一中多字段查詢的簡(jiǎn)化寫法,在多個(gè)字段之間用 ' | '隔開表示OR,用‘&’隔開表示AND
1、不同字段相同查詢條件
//使用相同的查詢條件
$user = M('User');
$map[' user|email '] = 'a'; // ' | '換成‘ & ’變成AND
var_dump($user->where($map)->select());
2、不同字段不同查詢條件
//使用不同查詢條件
$user = M(' User ');
$map[' id&user '] = array(1, '蠟筆小新',_multi=>true);
var_dump($user->where($map)->select());
PS:設(shè)置‘_multi’為true,是為了讓id對(duì)應(yīng)1,讓user對(duì)應(yīng)‘蠟筆小新’,否則就會(huì)出現(xiàn)id對(duì)應(yīng)了1還要對(duì)應(yīng)‘蠟筆小新’的情況,而且,這設(shè)置要在放在數(shù)組最后
//支持使用表達(dá)式結(jié)合快捷查詢
$user = M('User');
$map[' id&user '] = array(array(' gt ' ,0), '蠟筆小新' ,'_multi '=>true);
var_dump($user->where($map)->select());
區(qū)間查詢
ThinkPHP支持對(duì)某個(gè)字段的區(qū)間查詢
//區(qū)間查詢
$user = M('User');
$map[' id '] = array( array(' gt ' , 1 ) , array( ' lt ' , 4 ) );//意思是id大于1 和id小于4的。
var_dump($user->where($map)->select());
//第三個(gè)參數(shù)設(shè)置邏輯OR
$user = M(' User ');
$map[' id '] = array( array(' gt ' , 1) , array( ' lt ' , 4) , 'OR');
var_dump($user->where($map)->select);
組合查詢
組合查詢是基于索引數(shù)組查詢方式的一個(gè)拓展性查詢,添加了字符串查詢(_string),復(fù)合查詢(_complex),請(qǐng)求字符串查詢(_query),由于采用的是索引數(shù)組,重復(fù)的會(huì)被覆蓋。
//字符串查詢(_string)
$user = M(User);
$map[' id '] = array(' eq ' , 1);
$map[' _string '] = ' user= "蠟筆小新" AND mail = “xiaoxin@163.com” ';
var_dump($user->where($map)->select());
//請(qǐng)求字符串查詢(_query)
$user = M('User');
$map[' id '] = array('eq' ,1);
$map['_query'] = 'user = 蠟筆小新&maile = xiaoxin@163.com&_logic=OR';
var_dump($user->where($map)->select());
PS:這總方式是URL方式,不需要加引號(hào)
//復(fù)合查詢(_complex)
$user = M(User);
$where[' user '] = array(' like ' , ' %小% ');
$where['id'] = 1;
$where['_logic'] = 'OR'
$map['_complex'] = $where;
$map['id'] = 3;
$map['_logic'] = 'OR'
var_dump($user->where($map)-select());
PS:復(fù)合查詢可以構(gòu)建更加復(fù)雜的查詢,這里id=1或者id = 3可以構(gòu)建實(shí)現(xiàn)。
統(tǒng)計(jì)查詢
//Tinkphp提供了一些統(tǒng)計(jì)查詢的方法
//數(shù)據(jù)總條數(shù),遇到NULL不統(tǒng)計(jì)
$user = M('User');
var_dump($user->count(' mail ' ) );
//最大值
$user = M('User');
var_dump($user->max(' id ' ) );
//最小值
$user = M('User');
var_dump($user->min(' id ' ) );
//平均值
$user = M('User');
var_dump($user->avg(' id '));
//求總和
$user = M(' User ');
var_dump($user->sum(' id '));
動(dòng)態(tài)查詢
借助PHP5語(yǔ)言的特性,ThinkPhp實(shí)現(xiàn)了動(dòng)態(tài)查詢
1、getBy動(dòng)態(tài)查詢
//查找mail=xiaoxin@163.com的數(shù)據(jù)
$user = M('User');
var_dump($user->getByMail('xiaoxin@163.com'));
2、getFieldBy動(dòng)態(tài)查詢
//通過(guò)user得到相應(yīng)id值
$user = M('User');
var_dump($user->getFieldByUser('路飛',‘id’));
SQL查詢
ThikPHP支持原生SQL查詢
1、query讀取
//查詢結(jié)果集,如果采用分布式讀寫分離,即始終在讀服務(wù)器執(zhí)行。
$user = M('User');
var_dump($user->query('SELECT *FROM think_user'));
2、execute寫入
//更新和寫入,如果采用分布式讀寫分離,則始終在寫服務(wù)器執(zhí)行
$user = M('User');
var_dump($user->execute('UPDATE think_user set user=''蠟筆大新“ WHERE id=1' ));
PS:由于子查詢用了不少連貫操作,我們會(huì)在連貫才做講解。
//實(shí)例化Model類
//字符串作為條件查詢
$user = M('User');
//查出user表中的 id=1的 名稱為蠟筆小新的數(shù)據(jù)。
var_dump($user->where('id=1 AND user="蠟筆小新" ')->select())
-----------------分割線-----------------
-----------------分割線-----------------
--------------------------分割線----------------------
####快捷查詢
快捷查詢方式是一種多字段查詢的簡(jiǎn)化寫法,在多個(gè)字段之間用'|'隔開表示OR,用‘&’隔開表示AND
1、不同字段相同查詢條件
//使用字段相同查詢條件
$user = M('User');
$map['user|email'] = 'a'; //'|'換成‘&’變成AND
2、不同字段不同查詢條件
//使用不同查詢條件
$user = M('User');
$map['id&user'] = array(1,'蠟筆小新',‘_multi’=>true);//這句代碼的意思是id和user分別對(duì)應(yīng)著1 和 蠟筆小新 _multi=>true意思是一一對(duì)應(yīng)。如果不寫這個(gè)得話,會(huì)出現(xiàn)id對(duì)應(yīng)了1還要對(duì)應(yīng)‘蠟筆小新’的情況,而且,這設(shè)置要放在數(shù)組最后。
//支持使用表達(dá)式結(jié)合快捷查詢
$user = M('User');
$map['id&user'] = array(array('gt',0),'蠟筆小新',‘_multi’=>true);//gt的意思是大于 整體的意思是 id大于0的 user是蠟筆小新的 這一條。
----------------分割線----------
###組合查詢
$user = M('User');
$map['id'] = array('eq',1);
$map['_string'] = 'user="蠟筆小新" AND email=“xiaoxin@163.com” ';//
var_dump($user->where($map)->select());
六、統(tǒng)計(jì)查詢