今天来给大家讲下查询最常用但也是最复杂的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. Spring3整合Quartz实现定时作业

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

  2. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

  3. python IDE 集合

    python ruby等语言由于其小众和动态特性,缺少优良的IDE,本篇将介绍主要的python IDE. 1.python安装后自带有IDLE,简单方便,应该算是最简单的编辑环境了,但是过于简单,不 ...

  4. (面试题)如何查找Oracle数据库中的重复记录

    今天做了个面试题:查找Oracle数据库中的重复记录,下面详细介绍其他方法(参考其他资料) 本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同 ...

  5. swagger配置和简单使用

    说明:本地环境idea + maven3.5 + springboot2.0.0 + springfox-swagger2 2.8.0  + springfox-swagger-ui 2.8.0 +  ...

  6. js前台取用后台传递过来的map集合方式

    在处理有些特殊需求的时候,我们需要在前台页面的js中获取后台传递过来的map集合类型的参数,并且进行调用,代码如下: 在后台我们拼装出如下的集合: Map<String,Grade> gr ...

  7. Four Node.js Gotchas that Operations Teams Should Know about

    There is no doubt that Node.js is one of the fastest growing platforms today. It can be found at sta ...

  8. centos7 安装后需要做的事情

    安装centos 7 系统之后要做的几件事 #修改主机名 hostnamectl --static set-hostname xd-1 vim /etc/hosts127.0.0.1 xd-1x.x. ...

  9. mac 下搭建 php + apache + mysql 服务器(cool)

    之前做.net 网站.后转ios .所有很少接触windows 啦.但有时候自己还真需要个测试的服务器环境.干脆把自己电脑搞成服务器得了 下面贴上链接: Apache+PHP+Mysql OS X 1 ...

  10. 用sendcloud来发邮件

    平时发验证码邮件都是用免费域名邮箱,但是有时一频繁发多了就发不了了,听说用sendcloud可以避免,还能避免阿里云邮件发QQ邮箱进垃圾箱中,去注册了下,免费账户号每个月才50封,自己玩玩可以吧.. ...