今天来给大家讲下查询最常用但也是最复杂的where方法,where方法也属于模型类的连贯操作方法之一,主要用于查询和操作条件的设置。
where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询、表达式查询、快捷查询、区间查询、组合查询在内的查询操作。where方法的参数支持字符串和数组,虽然也可以使用对象但并不建议。

字符串条件

使用字符串条件直接查询和操作,例如:

  1. $User = M("User"); // 实例化User对象

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

 
 

最后生成的SQL语句是

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

 
 

如果使用3.1以上版本的话,使用字符串条件的时候,建议配合预处理机制,确保更加安全,例如:

  1. $Model->where("id=%d and username='%s' and

  2. xx='%f'",array($id,$username,$xx))->select();

 
 

或者使用:

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

 
 

如果$id变量来自用户提交或者URL地址的话,如果传入的是非数字类型,则会强制格式化为数字格式后进行查询操作。
字符串预处理格式类型支持指定数字、字符串等,具体可以参考vsprintf方法的参数说明。

数组条件

数组条件的where用法是ThinkPHP推荐的用法。

普通查询

最简单的数组查询方式如下:

  1. $User = M("User"); // 实例化User对象

  2. $map['name'] = 'thinkphp';

  3. $map['status'] = 1;

  4. // 把查询条件传入查询方法

  5. $User->where($map)->select();

 
 

最后生成的SQL语句是

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

 
 

表达式查询

上面的查询条件仅仅是一个简单的相等判断,可以使用查询表达式支持更多的SQL查询语法,查询表达式的使用格式:

  1. $map['字段1']  = array('表达式','查询条件1');

  2. $map['字段2']  = array('表达式','查询条件2');

  3. $Model->where($map)->select(); // 也支持

 
 

表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:

表达式 含义
EQ 等于(=)
NEQ 不等于(<>)
GT 大于(>)
EGT 大于等于(>=)
LT 小于(<)<>
ELT 小于等于(<=)<>
LIKE 模糊查询
[NOT] BETWEEN (不在)区间查询
[NOT] IN (不在)IN 查询
EXP 表达式查询,支持SQL语法

示例如下:
EQ :等于(=)
例如:

  1. $map['id']  = array('eq',100);

 
 

和下面的查询等效

  1. $map['id']  = 100;

 
 

表示的查询条件就是 id = 100

NEQ: 不等于(<>)
例如:

  1. $map['id']  = array('neq',100);

 
 

表示的查询条件就是 id <> 100

GT:大于(>)
例如:

  1. $map['id']  = array('gt',100);

 
 

表示的查询条件就是 id > 100

EGT:大于等于(>=)
例如:

  1. $map['id']  = array('egt',100);

 
 

表示的查询条件就是 id >= 100

LT:小于(<)<>
例如:

  1. $map['id']  = array('lt',100);

 
 

表示的查询条件就是 id < 100

ELT: 小于等于(<=)<>
例如:

  1. $map['id']  = array('elt',100);

 
 

表示的查询条件就是 id <= 100

[NOT] LIKE: 同sql的LIKE
例如:

  1. $map['name'] = array('like','thinkphp%');

 
 

查询条件就变成 name like 'thinkphp%'
如果配置了DB_LIKE_FIELDS参数的话,某些字段也会自动进行模糊查询。例如设置了:

  1. 'DB_LIKE_FIELDS'=>'title|content'

 
 

的话,使用

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

 
 

查询条件就会变成 name like '%thinkphp%'
支持数组方式,例如

  1. $map['a'] =array('like',array('%thinkphp%','%tp'),'OR');

  2. $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, 查询条件支持字符串或者数组,例如:

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

 
 

和下面的等效:

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

 
 

查询条件就变成 id BETWEEN 1 AND 8

[NOT] IN: 同sql的[not] in ,查询条件支持字符串或者数组,例如:

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

 
 

和下面的等效:

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

 
 

查询条件就变成 id NOT IN (1,5, 8)

EXP:表达式,支持更复杂的查询情况
例如:

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

 
 

可以改成:

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

 
 

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

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

  1. $User = M("User"); // 实例化User对象

  2. // 要修改的数据对象属性赋值

  3. $data['name'] = 'ThinkPHP';

  4. $data['score'] = array('exp','score+1');// 用户的积分加1

  5. $User->where('id=5')->save($data); // 根据条件保存修改的数据

 
 

快捷查询

where方法支持快捷查询方式,可以进一步简化查询条件的写法,例如:
一、实现不同字段相同的查询条件

  1. $User = M("User"); // 实例化User对象

  2. $map['name|title'] = 'thinkphp';

  3. // 把查询条件传入查询方法

  4. $User->where($map)->select();

 
 

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

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

  1. $User = M("User"); // 实例化User对象

  2. $map['status&title'] =array('1','thinkphp','_multi'=>true);

  3. // 把查询条件传入查询方法

  4. $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方法支持对某个字段的区间查询,例如:

  1. $map['id'] = array(array('gt',1),array('lt',10)) ;

 
 

得到的查询条件是: (`id` > 1) AND (`id` < 10)

  1. $map['id'] = array(array('gt',3),array('lt',10), 'or') ;

 
 

得到的查询条件是: (`id` > 3) OR (`id` < 10)

  1. $map['id']  = array(array('neq',6),array('gt',3),'and');

 
 

得到的查询条件是:(`id` != 6) AND (`id` > 3)
最后一个可以是AND、 OR或者 XOR运算符,如果不写,默认是AND运算。
区间查询的条件可以支持普通查询的所有表达式,也就是说类似LIKE、GT和EXP这样的表达式都可以支持。另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起,例如:

  1. $map['name']  = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), 'ThinkPHP','or');

 
 

最后的查询条件是:

  1. (`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')

 
 

组合查询

组合查询用于复杂的查询条件,如果你需要在查询的时候同时偶尔使用字符串却又不希望丢失数组方式的灵活的话,可以考虑使用组合查询。
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的索引方式,索引相同的特殊查询会被覆盖。
一、字符串模式查询(采用_string 作为查询条件)
数组条件还可以和字符串条件混合使用,例如:

  1. $User = M("User"); // 实例化User对象

  2. $map['id'] = array('neq',1);

  3. $map['name'] = 'ok';

  4. $map['_string'] = 'status=1 AND score>10';

  5. $User->where($map)->select();

 
 

最后得到的查询条件就成了:
( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )

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

  1. $map['id'] = array('gt','100');

  2. $map['_query'] = 'status=1&score=100&_logic=or';

 
 

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

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

  1. $where['name']  = array('like', '%thinkphp%');

  2. $where['title']  = array('like','%thinkphp%');

  3. $where['_logic'] = 'or';

  4. $map['_complex'] = $where;

  5. $map['id']  = array('gt',1);

 
 

查询条件是 
( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。
很多查询方式可以相互转换,例如上面的查询条件可以改成:

  1. $where['id'] = array('gt',1);

  2. $where['_string'] = ' (name like "%thinkphp%")  OR ( title like "%thinkphp") ';

 
 

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

多次调用

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

  1. $map['a'] = array('gt',1);

  2. $where['b'] = 1;

  3. $Model->where($map)->where($where)->where('status=1')->select();

 
 

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

Thinkphp CURD中的where方法的更多相关文章

  1. thinkphp 框架中的一部分方法解析

     1 thinkphp 框架 中判断输入的数值和数据库中的数值是否一致    首先 需要在view文件夹下建一个模板 名为zhuce.html <html> <head> &l ...

  2. ThinkPHP问题收集:模板中使用U方法时无法嵌套大括号,For标签,插入数据,新增的表字段缓存问题

    ThinkPHP模板中使用U方法时无法嵌套大括号需要在control里面用U方法赋值给变量传到模版如:{:U('/Blog/comment/',array('id'=>$id)}$comment ...

  3. ThinkPHP CURD方法中field方法详解

    导读:ThinkPHP CURD方法的field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询在查询操作中field方法是使用最频繁的.$M ...

  4. thinkPHP框架中执行原生SQL语句的方法

    这篇文章主要介绍了thinkPHP框架中执行原生SQL语句的方法,结合实例形式分析了thinkPHP中执行原生SQL语句的相关操作技巧,并简单分析了query与execute方法的使用区别,需要的朋友 ...

  5. thinkphp在前端页面的js代码中可以使用 U方法吗? 可以使用模板变量如__URL__等吗?

    thinkphp在前端页面的js代码中可以使用 U方法吗? : 可以的! tp的U方法, 是"全局的", 什么是全局的? 就是, 可以在 "任何地方"使用的: ...

  6. thinkphp中的dump方法

    感受一下,调试. 1.print_r() 2.var_dump() 3.再看看thinkphp中的dump方法 清晰多了!真实够傻的,今天才发现有这么好的调试方法.

  7. thinkphp 5 count()方法在控制器,模板中的使用方法

    thinkphp中关于count()方法的使用: 控制器中:echo count($arr)模板中:{$arr | count}模板中if判断语句中 <if condition="co ...

  8. thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法)

    thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法) 一.总结 记得看下面 1.获取器的作用是在获取数据的字段值后自动进行处理 2.修改器的作用是可以在数据赋值的时候自动进行转换处 ...

  9. ThinkPHP CURD返回结果参考

    ThinkPHP CURD返回结果参考: 1)查询$table->find() ##返回一条记录,是一个关联数组,是一维数组.$table->select() ##返回第一维是索引数组,第 ...

随机推荐

  1. Oracle 12C -- 预定义audit policies

    在12C中,预定义了三种审计策略:ora_secureconfig,ora_database_parameter,ora_account_mgmt可以通过脚本$ORACLE_HOME/rdbms/ad ...

  2. CentOS 7安装Redis4.0.10

    cd /usr/local/src && wget http://download.redis.io/releases/redis-4.0.10.tar.gz && t ...

  3. 公网用户接入NAT后面的freeswitch配置

    大致网络示意和终端号码: 客户端侧: 终端号码(1019)终端IP(192.168.1.15)+ 网关(192.168.1.1) + 路由器公网IP(动态地址) 服务器侧: 防火墙(181.92.2. ...

  4. ES6--变量的声明及解构赋值

    ​ ES6的目标是使得JavaScript语言能够用来编写大型的复杂的应用程序.成为企业级开发语言:该标准已于2015年6月17日正式公布. 可是真正的普及我觉得还得须要一段时间.然而这并非理由让我们 ...

  5. Navicat_Premium 连接oracle遇到ORA-28457

    解决方案很简单,我用oracle文件目录下的oci.dll替换了navicat文件目录下的oci.dll,之后很顺畅地就连上了.

  6. Intel CPU命名规则

    intel的几代CPU中,后缀字母主要有以下几种:M:笔记本专用CPU,一般为双核,M前面一位数字是0,意味着是标准电压处理器,如果是7,则是低电压处理器.U:笔记本专用低电压CPU,一般为双核,U前 ...

  7. Oozie-自定义实现WorkFlow中shell action

    拷贝默认的shell目录来进行修改 $ cp -r ./examples/apps/shell/ my-apps/ 定义job.properties nameNode=hdfs://bigdata-0 ...

  8. Android Webview SSL 自签名安全校验解决方案

    服务器证书校验主要针对 WebView 的安全问题. 在 app 中需要通过 WebView 访问 url,因为服务器采用的自签名证书,而不是 ca 认证,使用 WebView 加载 url 的时候会 ...

  9. Java 泛型(Generics) 综述

    一. 引子 一般的类和方法.仅仅能使用详细类型:要么是基本类型.要么是自己定义类型.假设要编写能够应用于多种类型的代码,这样的刻板的限制对代码的束缚就会非常大. 多态算是一种泛化机制,但对代码的约束还 ...

  10. android studio(AS) Duplicate files copied in APK META-INF/NOTICE.txt

    File 1: /home/slava/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.3.1/f789 ...