今天来给大家讲下查询最常用但也是最复杂的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. SimpleAdapter真不简单!

    作为一名编程初学者,我总是认为自己什么都不会,什么都不行,就算实现了文档指定的功能,我永远都是觉得自己写过的代码实在是太烂了,它只是恰巧能够运行而已!它只是在运行的时候恰巧没有发现错误而已!!一直都是 ...

  2. Loader Lock引起的一个Bug

    在Windows中,让程序模块化实现的一种方式,就是让事实上现为动态链接库. 然后在主程序启动的时候隐式或者显示的去载入动态链接库.可是假设不恰当的编写动态链接库的DllMain函数,将会引起意想不到 ...

  3. markdown中的锚点处理

    markdown markdown是一个相对简单的DSL,定义了简单的标签来描述html文档格式. 比如: #一级标题 来生成html <h1>一级标题<h1> ##二级标题 ...

  4. Oracle 客户端连接时报ORA-01019错误总结

    在.net+oracle开发中,发布web程序的时候,有是会遇到该错误 ora-01019 ORA-01019 unable to allocate memory in the user sideCa ...

  5. Python 文件 readline() 方法

    描述 Python 文件 readline() 方法用于从文件读取整行,包括 "\n" 字符.如果指定了一个非负数的参数,则返回指定大小的字符数,包括 "\n" ...

  6. VS Code 中文注释显示乱码

    将设置中的"files.autoGuessEncoding"项的值改为true即可. 1.文件 2.首选项 3.设置 4.搜索 "files.autoGuessEncod ...

  7. 如何上传代码到github?

    如何上传代码到github? 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安 ...

  8. WPF编程学习——窗口

    转自 http://www.cnblogs.com/libaoheng/archive/2011/11/18/2253751.html 本文目录 1.窗口的外观 2.窗口的位置 3.窗口的大小 4.窗 ...

  9. ansible 学习记录

    Ansible 的重新学习记录 这里我的Ansible的宿主机是centos 7.2系统,这里我通过yum 安装Ansible 1.配置epel源 sudo yum -y install epel-r ...

  10. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...