ThinkPHP教程_PHP框架之ThinkPHP(九)【查询语言】
一、概述
1、ThinkPHP支持直接使用字符串作为查询条件,但是大多数情况下推荐使用索引数组或对象来作为查询条件,因为更加安全!
2、查询条件可以用于CURD等任何操作,作为where方法的参数传入即可,ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作,下面来一一讲解查询语言的内涵。
3、查询语言分为普通查询、区间查询、组合查询、复合查询、统计查询、定位查询、SQL查询、动态查询
二、普通查询
查询条件可以为String、Array或Object类型
1、字符串
注意,如果连贯操作的方法采用String类型的参数,那么参数就得按照原生sql语句的写法。这里的"username='Tiger'"就验证了这句话,如果Tiger没有用''包起来,则会出错!
2、数组(索引数组)
3、对象
4、不知道大伙有没有发现,以上关于参数Array和Object类型的两个例子只能做到了一个相等的查询条件,那么怎么通过Array或Object类型参数来实现更加复杂的查询条件呢(显然String类型参数是可以做到的,故不赘述)?即使用查询表达式。以Array类型为例,Object类型同理!$condition['字段名']=array('表达式','查询条件');即内层数组的第一个元素值表示表达式、第二个元素值表示查询条件。表达式不区分大小写
·eq(相等)
·neq(不等)
·gt(大于)
·egt(大于等于)
·lt(小于)
·elt(小于等于)
·like(同原生sql语句中的LIKE)
可以进行模糊匹配
在应用配置文件中可以配置DB_LIKE_FIELDS,那么被配置项匹配的字段将会自动进行模糊匹配。比如说$condition['username']='Tiger';相当于username like '%Tiger%'
·between/notbetween
查询条件支持String或Array类型,即内层数组的第二个元素值可以是字符串或数组
·in/notin
查询条件同样支持String和Array类型
·exp
表达式,支持更复杂的查询情况
查询条件是一个按照原生sql语句格式书写的完整的查询表达式(可以使用原生sql语句支持的语法,包括使用sql函数、字段等等)(额,似乎回到了where(字符串查询条件)),即内层数组的第二个元素值是一个完整的查询表达式
查询条件只支持String类型
其不仅可以用于查询表达式,还可以用于更新操作
三、区间查询
ThinkPHP支持对某个字段进行区间查询
内层数组的最后一个元素值默认是'AND',也可以是'OR','XOR'
内层数组的最后一个元素之前并不是只可能有两个元素,而是可以有多个元素的,且元素值为数组
四、组合查询
1、ThinkPHP在进行多字段查询时,默认的逻辑关系是逻辑与(AND),可以通过外层数组元素键'_logic'指定逻辑关系
2、通过外层数组元素键'_string'还可以实现数组条件与字符串条件混合使用
五、复合查询
通过外层数组元素键'_complex'可以指定查询子条件
六、统计查询
在实际开发中,经常会用到统计数据,比如说,当前所有(或满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等。ThinkPHP会这些可能的统计操作都设计了相应的内置方法
而且统计查询方法都支持连贯操作。那么显然可以用where()方法定义查询范围咯
1、count()方法
获取当前数据表的记录数
2、max()方法
获取数据表中某个字段最大值
3、min()方法
与max()同理
4、avg()方法
与max()同理
5、sum()方法
与max()同理
七、定位查询
ThinkPHP支持定位查询,但是必须要求当前模型继承高级模型类,可以使用getN()方法直接访问结果中某个位置的记录
getN(正整数)、getN(负整数)、first()、last()
八、SQL查询
ThinkPHP仍然保留了原生的SQL查询(R)和执行(CUD)操作支持,为了满足复杂查询的需要和一些特殊的数据操作,SQL查询的返回值是直接返回Db类的查询结果,没有做任何的处理。而且可以支持查询缓存
1、query()方法
有受影响行数,且有结果集,用该方法。参数为完整的原生sql语句
2、execute()方法
有受影响函数,没有结果集,用该方法。参数为完整的原生sql语句
九、动态查询
1、直接根据数据表的字段进行查询,但是只支持单字段
2、获取符合条件的前N条记录
直接使用topN()方法,同样的必须继承高级模型
对于ThinkPHP的动态查询,咋一看可能不太好理解,可能会问,$User这个对象哪来的getByUsername()、top3()或top()方法呢?Model类和AdvModel类都没有这些方法,而自定义的UserModel类也没有这些方法?!
PHP同JavaScript一样,也支持动态给对象添加公开的属性或方法!