#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
- 如查找到预期的结果则返回结果数组,数组的键是字段名,数组的值是数据。
从数据表中查找记录
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是按主键的正序来进行查找。
在通常的数据库查找中,节省系统资源的一个方法,是限定查找返回的字段,可以减少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