#1 jake

SpeedPHP框架中的spModel数据库操作类,用于数据查找的函数有find、findAll、findBy和findSql。

本章将详细介绍find/findAll函数,findBy在“按字段查询”一节中讲述,而findSql将在“SQL查询”一节中讲述。

定义:

find

从数据表中查找一条记录

array find(mixed conditions, string sort, string fields)

参数:


  • mixed conditions 查找条件,数组array("字段名"=>"查找值")或字符串,请注意在使用字符串时将需要开发者自行使用__val_escape来对输入值进行过滤
  • string sort 排序,等同于“ORDER BY ”
  • string fields 返回的字段范围,默认为返回全部字段的值

返回:


  • 按条件查询不到任何数据,find将返回FALSE
  • 如查找到预期的结果则返回结果数组,数组的键是字段名,数组的值是数据。
findAll

从数据表中查找记录

array findAll(mixed conditions, string sort, string fields, string limit)

参数:


  • mixed conditions 查找条件,数组array("字段名"=>"查找值")或字符串,请注意在使用字符串时将需要开发者自行使用__val_escape来对输入值进行过滤
  • string sort 排序,等同于“ORDER BY ”
  • string fields 返回的字段范围,默认为返回全部字段的值
  • string limit 返回的结果数量限制,等同于“LIMIT ”,如$limit = " 3, 5",即是从第3条记录开始获取,共获取5条记录

返回:


  • 按条件查询不到任何数据,findAll将返回FALSE
  • 如查找到预期的结果则返回结果数组。对比find返回的结果,findAll是返回了二维数组,并且数组的每一项将是代表一条记录的数组。
find和findAll的区别,是find等于findAll的limit参数等于1的情况,也就是只返回最前面一条记录的findAll。所以以下只介绍findAll的使用,而find也是同样适用(仅是limit参数不能设置,只能为1)。

对于find/findAll的使用,前面我们已经有一些例子说明了,主要是集中在“条件”$conditions参数中:

1. 当$conditions为数组的时候,数组的键为查找的字段名,对应的值为查询的值。而数组内有多个条件,则这些条件为AND的关系(就是“与”的关系,当这些条件“同时”满足,才是正确的结果)。

$conditions = array( 'name' => '小李' ); 
$result = $gb->findAll($conditions);
dump($result);               

2. 当$conditions为字符串的时候,字符串代表了查询中WHERE的查询语句。

SELECT * FROM spgb_gb WHERE contents like '%SpeedPHP%'

等于:

$conditions = "  contents like '%SpeedPHP%' '";

$results = $gb->findAll($conditions);


下面我们继续介绍find/findAll的其他条件:$sort、$fields、$limit,其中find是没有limit的(可以说findAll的limit等于1就是find)

$sort,排序方法,等于SQL语句中的ORDER BY(排序)

首先我们来看看,通常SQL语句中的排序是如何实现的,比如说留言本中需要按照时间先后排序(正序,就是ASC,反序DESC)

SELECT * FROM  spgb_gb ORDER BY post_time ASC // 正序,也就是时间小的排前面

SELECT * FROM  spgb_gb ORDER BY post_time DESC // 反序,时间大的排前面

SELECT * FROM spgb_gb WHERE name = 'jake' ORDER BY post_time ASC, replay DESC // 查询留言者是jake的留言,按时间正序然后回复反序的方式排列(一般按回复内容的头字母排列)

而当我们使用find/findAll的时候,可以:

$results = $gb->findAll(null, " post_time ASC "); // 条件为空,排序是时间正序

$results = $gb->findAll(null, " post_time DESC "); // 条件为空,排序是时间反序

$results = $gb->findAll(array( 'name' => 'jake' ), " post_time ASC, replay DESC "); // 条件为name=jake,排序是时间正序然后回复反序的方式排列

从上面可以看出,$sort参数就是直接使用ORDER BY的条件来排序的。即使有多个排序条件,也是可以和SQL语句一样使用的。

在$sort条件未设置的情况下,默认$sort是按主键的正序来进行查找。
$fields,仅获取的字段,等于SQL语句SELECT和FROM之间的返回字段,默认为 * (也就是返回所有字段)

在通常的数据库查找中,节省系统资源的一个方法,是限定查找返回的字段,可以减少PHP和数据库之间的数据流量,以达到优化程序和提高速度的目的。

SELECT gid, name, contents FROM  spgb_gb

SELECT spgb_gb.gid, spgb_gd.name, spgb_gb.contents FROM spgb_gb

以上两条SQL语句的相等的,而第二条SQL语句在返回的字段名称前,加上的表全名,这样做更为严谨。

而使用find/findAll,可以:

$results = $gb->findAll(null, null, " gid, name, contents "); // 条件为空,排序为默认的主键ID排序,返回字段限制是gid, name, contents

$results = $gb->findAll(null, null, " spgb_gb.gid, spgb_gd.name, spgb_gb.contents "); // 和上面相同

而在输出$results结果的时候,我们可以看到,find/findAll返回的结果仅有gid, name, contents

$result = array(

0 => array(
'gid' => 12,
'name' => '小李',
'contents' => '我的留言',
),

1 => array(
'gid' => 13,
'name' => '小李',
'contents' => '我的第二条留言',
),

);       

在使用$fields的时候,请注意:$fields一定要包括排序$sort的字段,比如按时间排序,那么$fields是务必要包含时间字段。当$sort 为空(默认)的时候,那么$field需要包含主键(因为默认$sort是按主键排序的)

$limit,对查找结果数量和位置的限制,等于SQL语句中的LIMIT(结果限制)

数据库查找的时候,我们通常需要对查找的结果进行限制,如仅返回10条结果,或是返回从第30条开始计算,取10条记录(也就是30到40的记录)

对结果的限制,一般是和$sort结合使用,如按留言时间反序,获取10条记录

SELECT * FROM spgb_gb ORDER BY post_time DESC LIMIT 10 // 按时间反序,获取前面10条记录,相等于  LIMIT 0, 10(从0条开始,获取10条记录)

SELECT * FROM spgb_gb ORDER BY post_time DESC LIMIT 30, 10 // 按时间反序,获取从30条开始的10条记录

而findAll则是:

$results = $gb->findAll(null, null, " post_time DESC  ", " 10 ");  

$results = $gb->findAll(null, null, " post_time DESC  ", " 30, 10 ");

使用$limit的时候要注意以下三点:

1. 如果使用spPager来进行数据库查找分页,那么findAll的$limit不能设置(保留默认为空),因为spPager会自动加上limit参数来进行查找。

2. limit 10是等同于 limit 0,10 的,在开始为0条记录的时候,可以忽略前面的0

3. find等于findAll的$limit = 1的情况。



2012-08-04 16:21:00