一、查询方式
ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用数组或者对象来作为查询条件,因为更加安全。
1.使用字符串作为查询条件
这是最传统的方式,但是安全性不高,eg:
$User = M('User');
$User->where('name="tom" and status=1')->select();
最后生成的SQL的语句是:
SELECT * FROM t_user where name="tom" and status=1;
2.使用数组作为查询条件
这是最常用的查询方式,
eg:
$User = M('User');
$condition['name'] = 'tom';
$condition['status'] = 1;
$User->where($condition)->select(); //把查询条件传入查询方法
生成的SQL语句同上
如果进行多字段查询,那么字段之间的默认逻辑关系是逻辑与AND,但是用下面的规则可以更改默认的逻辑判断,通过使用_logic定义查询逻辑:
$User = M('User');
$condition['name'] = 'thinkphp';
$conditon['account'] = 'thinkphp';
$conditon['_logic'] = 'OR';
$User->where($condition)->select();
生成的SQL语句是:
SELECT * FROM t_user WHERE 'name' = 'thinkphp' OR 'account' = 'thinkphp';
3.使用对象方式来查询
$user = M('User');
$condition = new stdClass();
$condition->name = 'thinkphp';
$condition->status = 1;
$User->where($condition)->select();
备注:
(1).stdClass在PHP5才开始被流行,而stdClass也是zend的一个保留类。stdClass是PHP的一个基类,所有的类几乎都继承这个类,所以任何时候都可以被new,可以让这个变量成为一个object。同时,这个基类又有一个特殊的地方,都没有方法。
(2).使用对象方式查询和使用数组查询的效果是相同的,并且是可以互换的,大多数情况下,我们建议采用数组方式更加高效。
二、表达式查询
查询表达式的使用条件:
$map['字段名'] = array('表达式','查询条件');
表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:
表达式 | 含义 | 相当于 |
EQ | 等于(=) | equal |
NEQ | 不等于(<>) | not equal |
GT | 大于(>) | greater |
EGT | 大于等于(>=) | equal or greater |
LT | 小于(<) | less than |
ELT | 小于等于(<=) | equal or less than |
LIKE | 模糊查询 | |
[NOT] BETWEEN | (不在)区间查询 | |
[NOT] IN | (不在)IN查询 | |
EXP | 表达式查询,支持SQL语法 | expression |
eg:
like =>
$map['name'] = array('like','th%');
查询条件就变成了 name like 'th%' 如果配置了DB_LIKE_FIELDS参数的话,某些字段也会自动进行模糊查询,例如设置了:
'DB_LIKE_FIELDS' => 'title|name';
那么,使用 $map['title'] = 'thinkphp';查询条件就会变成 title like '%thinkphp%'支持数组方式:
$map['a'] = array('like',array('%think%','%tp'),'OR');
SQL:
a like '%think%' or a like '%tp'
BETWEEN =>
$map['id'] = array('between','1,8');
<=> $map['id'] = array('between',array('1','8'));
EXP =>
支持更复杂的查询条件
$map['id'] = array('in','1,3,8');
<=> $map['id'] = array('exp',' In(1,3,8) ');
exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。查询表达式不仅可用于查询条件,也可以用于数据更新,eg:
$User = M('User');
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');
$User->where('id=5')->save($data);
三、快捷查询
快捷查询方式是一种多字段查询的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询
1.不同字段相同的查询条件
$User = M('User');
$map['name|title'] = 'thinkphp';
$User->where($map)->select();
SQL:
name = 'thinkphp' OR title="thinkphp";
2.不同字段不同的查询条件
$User = M("User");
$map['status&score&title'] = array('1',array('gt','0'),'thinkphp','_multi'=>true);
$User->where($map)->select();
'_multi'=>true必须加在数组的最后,表示当前是多条件匹配。
SQL:
status=1 and score>0 and title="thinkphp";
注:快捷查询方式中'|' 和'&'不能同时使用
四、统计查询
就是利用一些统计函数就行数据的查询,ThinkPHP为这些统计操作提供了一系列的内置方法,包括:
Count: 统计数量,参数是要统计的字段名(可选)
Max : 获取最大值,参数是要统计的字段名(必须)
Min : 获取最小值,参数是要统计的字段名(必须)
Avg : 获取平均值,参数是要统计的字段名(必须)
Sum : 获取总分,参数是要统计的字段名(必须)
eg:
$User = M('User');
$userCount = $User->count();
<=> $userCount = $User->count("id");
$maxScore = $User->max('score');
$minScore = $User->where('score>0')->min('score');
五、SQL查询
1.query方法
query方法用于执行SQL查询操作,如果数据非法或者查询错误则返回false,否则返回查询结果数据集(同select方法)
$Model = new Model();
$Model->query("select * from think_user where name = 'jack'");
2.execute方法
execute用于更新和写入数据的sql操作,如果数据非法或者查询错误则返回false,否则返回影响的记录数
$Model = new Model();
$Model->execute("update think_user set name='thinkPHP' where status = 1");
注:如果当前采用分布式数据库,并且设置了读写分离的话,query方法始终是在读服务器执行,因此query方法对应的都是读操作,execute方法始终是在写服务器执行,因此execute方法对应的都是写操作,而不管你的SQL语句是什么
六、动态查询
ThinkPHP实现的动态查询方法主要有以下几种:
getBy 根据字段的值查询数据 eg:getByName,getByEmail
getFieldBy 根据字段查询并返回某个字段的值 eg:getFieldByName
1.getBy动态查询
该查询方法针对数据表的字段进行查询,例如,User对象拥有id,name,address等属性,那么我们就可以使用下面的查询方法来直接根据某个属性来查询符合条件的记录
eg:
$User = M('User');
$user = $User->getByName('tom');
$user = $User->getByAddress('北京');
暂不支持多数据字段的动态查询方法,请使用find方法和select方法进行查询。
2.getFieldBy动态查询
针对某个字段查询并返回某个字段的值。
$userId = $User->getFieldByName('tom','id');
//表示根据用户的name获取用户的id值