1. 程式人生 > >thinkphp3.2 where 條件查詢

thinkphp3.2 where 條件查詢

where方法的用法是ThinkPHP查詢語言的精髓,也是ThinkPHP ORM的重要組成部分和亮點所在,可以完成包括普通查詢、表示式查詢、快捷查詢、區間查詢、組合查詢在內的查詢操作。where方法的引數支援字串和陣列,雖然也可以使用物件但並不建議。

字串條件

使用字串條件直接查詢和操作,例如:

$User->where('type=1 AND status=1')->select();

生成的sql語句:SELECT * FROM think_user WHERE type=1 AND status=1 如果使用3.1以上版本的話,使用字串條件的時候,建議配合預處理機制,確保更加安全,例如:

$Model->where("id=%d and username='%s' andxx='%f'",array($id,$username,$xx))->select();

或者

$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();

陣列條件

陣列條件的where用法是ThinkPHP推薦的用法。

普通查詢

最簡單的陣列查詢方式如下:

$User = M("User"); // 例項化User物件
$map['name'] = 'thinkphp';
$map
['status'] = 1; // 把查詢條件傳入查詢方法 $User->where($map)->select();

最後生成的sql:

SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
表示式查詢

上面的查詢條件僅僅是一個簡單的相等判斷,可以使用查詢表示式支援更多的SQL查詢語法,查詢表示式的使用格式:

$map['欄位1'] = array('表示式','查詢條件1');
$map['欄位2'] = array('表示式','查詢條件2');
$Model->where($map)->select
(); // 也支援

表示式不分大小寫,支援的查詢表示式有下面幾種,分別表示的含義是

表示式 含義

EQ 等於(=) NEQ 不等於(<>) GT 大於(>) EGT 大於等於(>=) LT 小於(<) ELT 小於等於(<=) LIKE 模糊查詢 [NOT] BETWEEN (不在)區間查詢 [NOT] IN (不在)IN 查詢 EXP 表示式查詢,支援SQL語法

$map['id'] = array('eq',100); //等價於 
$map['id'] = 100;
//不等於
$map['id'] = array('neq',100);

[NOT] LIKE:

$map['name'] = array('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

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

[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:表示式,支援更復雜的查詢情況

快捷查詢

一、實現不同欄位相同的查詢條件

$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’

區間查詢

where方法支援對某個欄位的區間查詢,例如:

$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語句是一致的。

多次呼叫

3.1.3版本開始,where方法支援多次呼叫,但字串條件只能出現一次,例如:

$map['a'] = array('gt',1);
$where['b'] = 1;
$Model->where($map)->where($where)->where('status=1')->select();

多次的陣列條件表示式會最終合併,但字串條件則只支援一次。