ThinkPHP中where()使用方法詳解

不言
發布: 2023-03-30 07:56:01
原創
2510 人瀏覽過

這篇文章主要介紹了關於ThinkPHP中where()使用方法詳解,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

where方法可以用於對資料庫操作的結果進行篩選。即SQL查詢語句中的where子句。本文為大家介紹ThinkPHP中where()使用方法詳解,有興趣的朋友參考下

本文介紹ThinkPHP的where()方法的用法。 where方法可以用於對資料庫操作的結果進行篩選。即SQL查詢語句中的where子句。

今天來跟大家講下查詢最常用但也是最複雜的where方法,where方法也屬於模型類別的連貫操作方法之一,主要用於查詢和操作條件的設定。

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

字串條件

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

$User = M("User"); // 实例化User对象
$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' and
xx='%f'",array($id,$username,$xx))->select();
登入後複製

或使用:

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

##如果$id變數來自使用者提交或URL位址的話,如果傳入的是非數字類型,則會強制格式化為數字格式後進行查詢操作。

字串預處理格式類型支援指定數字、字串等,具體可以參考vsprintf方法的參數說明。

陣列條件

陣列條件的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語法

範例如下:

EQ :等於(=)

例如:

$map[&#39;id&#39;] = array(&#39;eq&#39;,100);
登入後複製

和下面的查詢等效

$map[&#39;id&#39;] = 100;
登入後複製

表示的查詢條件是id = 100

NEQ: 不等於(<>)

例如:

$map[&#39;id&#39;] = array(&#39;neq&#39;,100);
登入後複製

表示的查詢條件就是id <> 100

GT:大於(>)

例如:

$map[&#39;id&#39;] = array(&#39;gt&#39;,100);
登入後複製

表示的查詢條件是id > 100

EGT:大於等於(>=)

例如:

$map[&#39;id&#39;] = array(&#39;egt&#39;,100);
登入後複製

表示的查詢條件是id >= 100

LT:小於(<)

例如:

$map[&#39;id&#39;] = array(&#39;lt&#39;,100);
登入後複製

表示的查詢條件是id < 100

ELT: 小於等於(<=)

例如:

$map[&#39;id&#39;] = array(&#39;elt&#39;,100);
登入後複製

所表示的查詢條件是id <= 100

[NOT] LIKE: 同sql的LIKE

例如:


$map[&#39;name&#39;] = array(&#39;like&#39;,&#39;thinkphp%&#39;);
登入後複製

查詢條件就變成name like 'thinkphp%'

如果配置了DB_LIKE_FIELDS參數的話,某些欄位也會自動進行模糊查詢。例如設定了:

&#39;DB_LIKE_FIELDS&#39;=>&#39;title|content&#39;
登入後複製

的話,使用

$map[&#39;title&#39;] = &#39;thinkphp&#39;;
登入後複製

查詢條件就會變成name like '%thinkphp%'

支援陣列方式,例如

$map[&#39;a&#39;] =array(&#39;like&#39;,array(&#39;%thinkphp%&#39;,&#39;%tp&#39;),&#39;OR&#39;);
$map[&#39;b&#39;] =array(&#39;notlike&#39;,array(&#39;%thinkphp%&#39;,&#39;%tp&#39;),&#39;AND&#39;);
登入後複製

產生的查詢條件是:

(a like &#39;%thinkphp%&#39; OR a like &#39;%tp&#39;) AND (b not like &#39;%thinkphp%&#39; AND b not like &#39;%tp&#39;)
登入後複製

[NOT] BETWEEN :同sql的[not] between,查詢條件支援字串或數組,例如:

$map[&#39;id&#39;] = array(&#39;between&#39;,&#39;1,8&#39;);
登入後複製

和下面的等效:

$map[&#39;id&#39;] = array(&#39;between&#39;,array(&#39;1&#39;,&#39;8&#39;));
登入後複製

查詢條件變成id BETWEEN 1 AND 8

###[NOT] IN: 同sql的[not] in ,查詢條件支援字串或數組,例如:#########
$map[&#39;id&#39;] = array(&#39;not in&#39;,&#39;1,5,8&#39;);
登入後複製
#########和下面的等效:#########
$map[&#39;id&#39;] = array(&#39;not in&#39;,array(&#39;1&#39;,&#39;5&#39;,&#39;8&#39;));
登入後複製
#########查詢條件就變成id NOT IN (1,5, 8)######EXP:表達式,支援更複雜的查詢情況######例如: ###

$map[&#39;id&#39;] = array(&#39;in&#39;,&#39;1,3,8&#39;);
登入後複製

可以改成:

$map[&#39;id&#39;] = array(&#39;exp&#39;,&#39; IN (1,3,8) &#39;);
登入後複製

exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。

查询表达式不仅可用于查询条件,也可以用于数据更新,例如:

$User = M("User"); // 实例化User对象
// 要修改的数据对象属性赋值
$data[&#39;name&#39;] = &#39;ThinkPHP&#39;;
$data[&#39;score&#39;] = array(&#39;exp&#39;,&#39;score+1&#39;);// 用户的积分加1
$User->where(&#39;id=5&#39;)->save($data); // 根据条件保存修改的数据
登入後複製

快捷查询

where方法支持快捷查询方式,可以进一步简化查询条件的写法,例如:

一、实现不同字段相同的查询条件

$User = M("User"); // 实例化User对象
$map[&#39;name|title&#39;] = &#39;thinkphp&#39;;
// 把查询条件传入查询方法
$User->where($map)->select();
登入後複製

查询条件就变成 name= 'thinkphp' OR title = 'thinkphp'

二、实现不同字段不同的查询条件

$User = M("User"); // 实例化User对象
$map[&#39;status&title&#39;] =array(&#39;1&#39;,&#39;thinkphp&#39;,&#39;_multi&#39;=>true);
// 把查询条件传入查询方法
$User->where($map)->select();
登入後複製

'_multi'=>true必须加在数组的最后,表示当前是多条件匹配,这样查询条件就变成 status= 1 AND title = 'thinkphp' ,查询字段支持更多的,例如:

$map[&#39;status&score&title&#39;] =array(&#39;1&#39;,array(&#39;gt&#39;,&#39;0&#39;),&#39;thinkphp&#39;,&#39;_multi&#39;=>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[&#39;name&#39;] = array(array(&#39;like&#39;,&#39;%a%&#39;), array(&#39;like&#39;,&#39;%b%&#39;), array(&#39;like&#39;,&#39;%c%&#39;), &#39;ThinkPHP&#39;,&#39;or&#39;);
登入後複製

最后的查询条件是:

(`name` LIKE &#39;%a%&#39;) OR (`name` LIKE &#39;%b%&#39;) OR (`name` LIKE &#39;%c%&#39;) OR (`name` = &#39;ThinkPHP&#39;)
登入後複製

组合查询

组合查询用于复杂的查询条件,如果你需要在查询的时候同时偶尔使用字符串却又不希望丢失数组方式的灵活的话,可以考虑使用组合查询。

组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的索引方式,索引相同的特殊查询会被覆盖。

一、字符串模式查询(采用_string 作为查询条件)

数组条件还可以和字符串条件混合使用,例如:

$User = M("User"); // 实例化User对象
$map[&#39;id&#39;] = array(&#39;neq&#39;,1);
$map[&#39;name&#39;] = &#39;ok&#39;;
$map[&#39;_string&#39;] = &#39;status=1 AND score>10&#39;;
$User->where($map)->select();
登入後複製

最后得到的查询条件就成了:

( `id` != 1 ) AND ( `name` = &#39;ok&#39; ) AND ( status=1 AND score>10 )
登入後複製

二、请求字符串查询方式

请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件相等判断。

$map[&#39;id&#39;] = array(&#39;gt&#39;,&#39;100&#39;);
$map[&#39;_query&#39;] = &#39;status=1&score=100&_logic=or&#39;;
登入後複製

得到的查询条件是:`id`>100 AND (`status` = '1' OR `score` = '100')

三、复合查询

复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。
例如:

$where[&#39;name&#39;] = array(&#39;like&#39;, &#39;%thinkphp%&#39;);
$where[&#39;title&#39;] = array(&#39;like&#39;,&#39;%thinkphp%&#39;);
$where[&#39;_logic&#39;] = &#39;or&#39;;
$map[&#39;_complex&#39;] = $where;
$map[&#39;id&#39;] = array(&#39;gt&#39;,1);
登入後複製

查询条件是

( id > 1) AND ( ( name like &#39;%thinkphp%&#39;) OR ( title like &#39;%thinkphp%&#39;) )
登入後複製

复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。

很多查询方式可以相互转换,例如上面的查询条件可以改成:

$where[&#39;id&#39;] = array(&#39;gt&#39;,1);
$where[&#39;_string&#39;] = &#39; (name like "%thinkphp%") OR ( title like "%thinkphp") &#39;;
登入後複製

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

多次调用

3.1.3版本开始,where方法支持多次调用,但字符串条件只能出现一次,例如:

$map[&#39;a&#39;] = array(&#39;gt&#39;,1);
$where[&#39;b&#39;] = 1;
$Model->where($map)->where($where)->where(&#39;status=1&#39;)->select();
登入後複製

多次的数组条件表达式会最终合并,但字符串条件则只支持一次。

关于ThinkPHP中where()方法的使用,本文就介绍这么多,希望对您有所帮助,谢谢!

相关推荐:

ThinkPHP中redirect用法分析

以上是ThinkPHP中where()使用方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板