ThinkPHP中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[‘id‘]  = array(‘eq‘,100);

和下面的查询等效

$map[‘id‘]  = 100;

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

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

$map[‘id‘]  = array(‘neq‘,100);

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

GT:大于(>)
例如:

$map[‘id‘]  = array(‘gt‘,100);

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

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

$map[‘id‘]  = array(‘egt‘,100);

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

LT:小于(<)
例如:

$map[‘id‘]  = array(‘lt‘,100);

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

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

$map[‘id‘]  = array(‘elt‘,100);

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

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

$map[‘name‘] = array(‘like‘,‘thinkphp%‘);

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

‘DB_LIKE_FIELDS‘=>‘title|content‘

的话,使用

$map[‘title‘] = ‘thinkphp‘;

查询条件就会变成 name 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 :同sql的[not] between, 查询条件支持字符串或者数组,例如:

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

和下面的等效:

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

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

[NOT] IN: 同sql的[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:表达式,支持更复杂的查询情况
例如:

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

可以改成:

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

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

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

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

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

$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();

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

转自:http://www.splaybow.com/post/thinkphp-where-function.html

时间: 2024-08-06 07:29:21

ThinkPHP中where()方法的使用的相关文章

ThinkPHP中F方法快速缓存实例

一般使用文件方式的缓存就能够满足要求,而thinkPHP还提供了一个专门用于文件方式的快速缓存方法F方法. 由于采用的是PHP返回方式,所以其效率较S方法较高.F方法具有如下特点:1.简单数据缓存:2.文件形式保存:3.采用PHP返回数据方式加载缓存:4.支持子目录缓存以及自动创建:5.支持删除缓存和批量删除:$path="../Public/Runtime/";$str="fastrunaaaaaaaaaaaaaaaa";F("str/ffun"

ThinkPHP中create()方法自动验证

自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 原理: create()方法收集表单($_POST)信息并返回,同时触发表单自动验证,过滤非法字段, 在控制器中使用create()方法,(返回值为true/false),会自动触发模型类中的$_validate属性(为父类Model中的方法,在子类Model中重写),在$_validate中自定义验证规则(验证规则下面会详细说明),当create()方法没有数据即返回值为fals

关于ThinkPhp中getField方法存在的问题

在ThinkPhp中我们可以通过以下方式获取数据库数据 query:直接执行SQL查询操作 find:查询单选数据集 getField查询字段值 select:查询数据集 其他...... 但今天使用getField方法时查询某些字段时发现返回的结果却是Array类型(正常情况下是数据库中该字段对应的类型) 经过反复测试后又看了ThinkPhp的源码才发现原来getField的第一个参数中如果有字符","那么ThinkPhp会认为你查询的是多个字段,因此返回的结果就是Array类型 而

thinkPHP中_initialize方法实例分析

子类的_initialize方法自动调用父类的_initialize方法. 而php的构造函数construct,如果要调用父类的方法,必须在子类构造函数显示调用parent::__construct(); parent::_initialize() 是调用父类的_initialize方法,如果你的父类_initialize函数没有任何内容,不需要写parent::_initialize() <?php class BaseAction extends Action { // 继承Thinkph

thinkphp中limit方法

limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多.ThinkPHP的limit方法可以兼容所有的数据库驱动类的. 用法 限制结果数量 例如获取满足要求的10个用户,如下调用即可: $User = M('User');$User->where('status=1')->field('id,name')->limit(10)->select(); limit方法也可以用于写操作,例如更新满足要求的3条数据: $User = M('U

thinkphp中page方法

page方法也是模型的连贯操作方法之一,是完全为分页查询而诞生的一个人性化操作方法. 用法 我们在前面已经了解了关于limit方法用于分页查询的情况,而page方法则是更人性化的进行分页查询的方法,例如还是以文章列表分页为例来说,如果使用limit方法,我们要查询第一页和第二页(假设我们每页输出10条数据)写法如下: $Article = M('Article');$Article->limit('0,10')->select(); // 查询第一页数据$Article->limit('

thinkphp中table方法

table方法也属于模型类的连贯操作方法之一,主要用于指定操作的数据表. 用法 一般情况下,操作模型的时候系统能够自动识别当前对应的数据表,所以,使用table方法的情况通常是为了:切换操作的数据表:对多表进行操作:例如: $Model->table('think_user')->where('status>1')->select(); 也可以在table方法中指定数据库,例如: $Model->table('db_name.think_user')->where('s

thinkphp中data方法

data方法也是模型类的连贯操作方法之一,用于设置当前要操作的数据对象的值,可能大家不太习惯用这个方法,今天来讲解下如何用好data方法. 用法 写操作 通常情况下我们都是通过create方法或者赋值的方式生成数据对象,然后写入数据库,例如: $Model = D('User');$Model->create();// 这里略过具体的自动生成和验证判断$Model->add(); 又或者直接对数据对象赋值,例如: $Model = M('User');$Model->name = '流年

thinkphp中order方法

order方法属于模型的连贯操作方法之一,用于对操作的结果排序. 用法 $Model->where('status=1')->order('id desc')->limit(5)->select(); 注意:连贯操作方法没有顺序,可以在select方法调用之前随便改变调用顺序.支持对多个字段的排序,例如: $Model->where('status=1')->order('id desc,status')->limit(5)->select(); 如果没有指