请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 注册成为新用户

QQ登录

只需一步,快速开始

查看: 9706|回复: 0

[数据操作] 数据查找

[复制链接]
发表于 2012-8-4 16:21:00 | 显示全部楼层 |阅读模式

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的关系(就是“与”的关系,当这些条件“同时”满足,才是正确的结果)。

  1. $conditions = array( 'name' => '小李' );
  2. $result = $gb->findAll($conditions);
  3. 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

  1. $result = array(

  2. 0 => array(
  3. 'gid' => 12,
  4. 'name' => '小李',
  5. 'contents' => '我的留言',
  6. ),

  7. 1 => array(
  8. 'gid' => 13,
  9. 'name' => '小李',
  10. 'contents' => '我的第二条留言',
  11. ),

  12. );       
复制代码

在使用$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的情况。



您需要登录后才可以回帖 登录 | 注册成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2020-4-9 21:08

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表