ThinkPHP大多数情况使用的都是对象查询,因为充分利用了ORM查询语言,了解查询条件的定义对使用对象查询非常有帮助,对于复杂的查询,或者从安全方面考虑,通常我们可以使用HashMap对象或者索引数组来传递查询条件。查询条件可以用于find、findAll等所有有查询条件的方法,下面是几种查询条件的定义:
普通查询:
// 查询name为thinkphp的记录
$condition->put('name','thinkphp');
// 使用数组作为查询条件
$condition = Array();
$condition['name'] = 'thinkphp'; 使用Map方式查询和使用数组查询的效果是相同的,并且是可以互换的。
条件查询
在查询条件里面,如果仅仅使用
$map->put('name','thinkphp');
查询条件应该是 name = 'thinkphp'
如果需要进行其它方式的条件判断,可以使用
$map->put('name',array('like','thinkphp%'));
这样,查询条件就变成 name like 'thinkphp%'
$map->put('id',array('gt',100));
查询条件 id > 100
$map->put('id',array('in','1,3,8'));
// 或者使用数组范围
$map->put('id',array('in',array(1,3,8))); 上面表示的查询条件都是 id in (1,3,8)
支持的查询表达式有
EQ|NEQ|GT|EGT|LT|ELT|LIKE|BETWEEN|IN|NOT IN
区间查询
ThinkPHP支持对某个字段的区间查询,例如:
$map->put('id',array(1,10)); // id >=1 and id<=10
$map->put('id',array('10','3','or')); //id >= 10 or id <=3
$map->put('id',array(array('neq',6),array('gt',3),'and')); // id != 6 and id > 3
组合查询
如果进行多字段查询,那么字段之间的逻辑关系是 逻辑与 AND,但是用下面的规则可以更改默认的逻辑判断,例如下面的查询条件:
$map->put('id',array('neq',1));
$map->put('name','ok');
// 现在的条件是 id !=1 and name like '%ok%'
$map->put('_logic','or');
// 现在的条件变为 id !=1 or name like '%ok%'
多字段查询
ThinkPHP还支持直接对进行多字段查询的方法,可以简化查询表达式和完成最复杂的查询方法,例如:
$map->put('id,name,title',array(array('neq',1),array('like','aaa'),array('like','bbb'),'or'));
查询条件是
( id != 1) OR ( name like 'aaa') OR ( title like '%bbb%')
如果结合上面的几种方式,我们可以写出下面更加复杂的查询条件
$map->put('id',array('NOT IN','1,6,9'));
$map->put('name,email',array(array('like','thinkphp'),array('like','liu21st'),'or'));
以上查询条件变成:
( id NOT IN(1,6,9) ) AND ( ( name like 'aaa') OR ( title like '%bbb%') )
统计查询
在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法。
// 获取用户数
$userCount = $User->count();
// 获取用户的最大积分
$maxScore = $User->max('score');
// 获取积分大于0的用户的最小积分
$minScore = $User->min('score','score>0');
// 获取用户的平均积分
$avgScore = $User->avg('score');
// 统计用户的总成绩
$sumScore = $User->sum('score');
定位查询
ThinkPHP支持定位查询,可以使用getN方法直接返回查询结果中的某个位置的记录。例如:
// 返回符合条件的第2条记录
$User->getN(2,'score>80','score desc');
还可以获取最后第二条记录
$User->getN(-2,'score>80','score desc');
如果要查询第一条记录,还可以使用
$User->first('score>80','score desc');
// 获取最后一条记录
$User->last('score>80','score desc');
// 获取积分最高的前5条记录
$User->top(5,'','score desc');
动态查询
借助PHP5语言的特性,ThinkPHP实现了动态查询。该查询方式针对数据表的字段进行查询。例如,User对象拥有id,name,email,address 等属性,那么我们就可以使用下面的查询方法来直接根据某个属性来查询符号条件的记录。
$user = $User->getByName('liu21st');
上面的查询会转化为$User->getBy('name','liu21st')的查询语言来执行
$user = $User->getByEmail('liu21st@gmail.com');
$user = $User->getByAddress('中国深圳');
暂时不支持多数据字段的动态查询方法,请使用find方法和findAll方法进行查询。
ThinkPHP还提供了另外一种动态查询方式,就是获取符合条件的前N条记录
例如,我们需要获取当前用户中积分大于0,积分最高的前5位用户
$User->top5('score>0','*','score desc');
而在另外一个频道,我们需要获取点击最多的前10位主播