1 数据库查询

ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作。

查询条件可以用于CURD等任何操作,作为where方法的参数传入即可

1.1 ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用索引数组或者对象来作为查询条件,因为会更加安全。

查询方式

一、使用字符串作为查询条件
这是最传统的方式,但是安全性不高,例如:
  1. $User = M("User"); // 实例化User对象
  2. $User->where('type=1 AND status=1')->select(); 
最后生成的SQL语句是
SELECT * FROM think_user WHERE type=1 AND status=1
二、使用数组作为查询条件
  1. $User = M("User"); // 实例化User对象
  2. $condition['name'] = 'thinkphp';
  3. $condition['status'] = 1;
  4.  // 把查询条件传入查询方法
  5. $User->where($condition)->select(); 
最后生成的SQL语句是
SELECT * FROM think_user WHERE 'name'='thinkphp' AND status=1
如果进行多字段查询,那么字段之间的默认逻辑关系是 逻辑与 AND,但是用下面的规则可以更改默认的逻辑判断,通过使用 _logic 定义查询逻辑
  1. $User = M("User"); // 实例化User对象
  2. $condition['name'] = 'thinkphp';
  3. $condition['account'] = 'thinkphp';
  4. $condition['_logic'] = 'OR'; //定义查询逻辑
  5.  // 把查询条件传入查询方法
  6. $User->where($condition)->select(); 
最后生成的SQL语句是
SELECT * FROM think_user WHERE 'name'='thinkphp' OR `account`='thinkphp'
 
三、使用对象方式来查询 (这里以stdClass内置对象为例)
  1. $User = M("User"); // 实例化User对象
  2.  // 定义查询条件
  3. $condition = new stdClass(); 
  4. $condition->name = 'thinkphp'; 
  5. $condition->status= 1; 
  6. $User->where($condition)->select(); 
最后生成的SQL语句和上面一样
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
使用对象方式查询和使用数组查询的效果是相同的,并且是可以互换的,大多数情况下,我们建议采用数组方式更加高效,后面我们会以数组方式为例来讲解具体的查询语言用法。

1.2表达式查询

  上面的查询条件仅仅是一个简单的相等判断,可以使用查询表达式支持更多的SQL查询语法,并且可以用于数组或者对象方式的查询(下面仅以数组方式为例说明),查询表达式的使用格式:
$map['字段名'] = array('表达式','查询条件');
表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:

 

表达式含义
EQ 等于(=)
NEQ 不等于(<>)
GT 大于(>)
EGT 大于等于(>=)
LT 小于(<)
ELT 小于等于(<=)
LIKE 模糊查询
[NOT] BETWEEN (不在)区间查询
[NOT] IN (不在)IN 查询
EXP 表达式查询,支持SQL语法

 

 $map['id']  = array('eq',100);  id = 100;

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

 $map['name'] = array('like','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')

 2、连贯操作

  ThinkPHP模型基础类提供的连贯操作方法,可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作。使用也比较简单, 假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 ,代码如下:

  1. $User->where('status=1')->order('create_time')->limit(10)->select();

这里的where、order和limit方法就被称之为连贯操作方法,除了select方法必须放到最后一个外(因为select方法并不是连贯操作方法),连贯操作的方法调用顺序没有先后,例如,下面的代码和上面的等效:

  1. $User->order('create_time')->limit(10)->where('status=1')->select();

如果不习惯使用连贯操作的话,还支持直接使用参数进行查询的方式。例如上面的代码可以改写为:

  1. $User->select(array('order'=>'create_time','where'=>'status=1','limit'=>'10'));

使用数组参数方式的话,索引的名称就是连贯操作的方法名称。其实T不仅仅是查询方法可以使用连贯操作,包括所有的CURD方法都可以使用,例如:

  1. $User->where('id=1')->field('id,name,email')->find(); 
  2. $User->where('status=1 and id=1')->delete();

连贯操作通常只有一个参数,并且仅在当此查询或者操作有效,完成后会自动清空连贯操作的所有传值(有个别特殊的连贯操作有多个参数,并且会记录当前的传值)。简而言之,连贯操作的结果不会带入以后的查询。
系统支持的连贯操作方法有:

连贯操作作用支持的参数类型
where 用于查询或者更新条件的定义 字符串、数组和对象
table 用于定义要操作的数据表名称 字符串和数组
alias 用于给当前数据表定义别名 字符串
data 用于新增或者更新数据之前的数据对象赋值 数组和对象
field 用于定义要查询的字段(支持字段排除) 字符串和数组
order 用于对结果排序 字符串和数组
limit 用于限制查询结果数量 字符串和数字
page 用于查询分页(内部会转换成limit 字符串和数字
group 用于对查询的group支持 字符串
having 用于对查询的having支持 字符串
join* 用于对查询的join支持 字符串和数组
union* 用于对查询的union支持 字符串、数组和对象
distinct 用于查询的distinct支持 布尔值
lock 用于数据库的锁机制 布尔值
cache 用于查询缓存 支持多个参数
relation 用于关联查询(需要关联模型支持) 字符串

所有的连贯操作都返回当前的模型实例对象(this),其中带*标识的表示支持多次调用。

 2.1 limit操作

  在ThinkPHP的用法里面始终是limit('offset,length') ,无论是Mysql、SqlServer还是Oracle数据库,都是这样使用,系统的数据库驱动类会负责解决这个差异化。
使用示例:

  1. limit('1,10')

如果使用limit('10') 等效于 limit('0,10')

3.1版本以后,limit方法增加第二个参数支持,例如:

  1. $this->limit(10,100)->select();

和之前的用法

  1. $this->limit('10,100')->select();

等效。

posted on 2014-08-08 20:26  lanxian  阅读(2974)  评论(0编辑  收藏  举报