PHP开发笔记's Archiver

fangzhen 发表于 2008-10-22 23:16

ThinkPHP丰富的查询语言

ThinkPHP大多数情况使用的都是对象查询,因为充分利用了ORM查询语言,了解查询条件的定义对使用对象查询非常有帮助,对于复杂的查询,或者从安全方面考虑,通常我们可以使用HashMap对象或者索引数组来传递查询条件。查询条件可以用于find、findAll等所有有查询条件的方法,下面是几种查询条件的定义:

普通查询
代码: 复制内容到剪贴板
$condition = new HashMap();

// 查询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位主播
代码: 复制内容到剪贴板
$Master->top10('','*','visit desc');
原生SQL查询
ThinkPHP支持原生的SQL查询,在某些特殊的情况下可以满足应用的需要。
SQL查询的返回值因为是直接返回的Db类的查询结果,没有做任何的处理,所以永远是返回的数据集对象或者惰性数据查询对象。而且可以支持查询缓存、延迟加载和事务锁(悲观锁)。
SQL查询使用query方法
代码: 复制内容到剪贴板
$list = $User->query('select id,name from think_user');

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.