DTapi教程:26.数据库操作之 查询
示例
查询供应信息
1.原生的destoon查询方法
$r = DB::get_one("select count(*) as num from {$DT_PRE}sell_5 where status=3"); $items = $r['num']; $pages = pages($items,$page,$pagesize); if($items){ $lists = array(); $result = DB::query("select * from {$DT_PRE}sell_5 where status=3 order by addtime desc limit $page,$offset"); while($r = DB::fetch_array($result)){ $lists[] = $r; } }
原生destoon查询一个供应列表信息并且分页调用,总共用了十行代码,有点烦锁,对于php新人来说确实难以记忆。
2.DTapi查询方法,
$lists = Db::table('sell_5')->condition("status=3")->order("addtime desc")->page($page,$pagesize)->showpage()->get_lists();
DTapi实现同样的效果,只用了一行代码,对的就是一行代码,就是这么简单。
##查询语句基本构成
因为使用DTapi的大多是php新人,对面向对像编程可能不理解其原理,所以也就无从理解对像的链式操作,这里我们也就不深究其原理了,只要学会用就行了。用的多了慢慢就明白了,我当时作为菜鸟时也是这么过来的。
DTapi的查询操作基本构成
1.查询多条信息
$data = Db::table('sell_5')->get_lists();
2.查询单条信息
$data = Db::table('sell_5')->get_one();
其中table('不加前缀的表名') 是必须的方法,告诉数据库要查询哪个表。
get_lists() 和get_one() 是二选一的必须方法,告诉数据库我是要查询单条信息还是多条信息。
除了以上三个方法是必须方法外,其它的都是可选方法。
##必须方法
table()方法
告诉数据要查询哪个表,记住不需要带前缀。 例:table('sell_5') table方法必须跟在 Db:: 后面,否则会报错 例:Db::table('sell_5')
get_lists()方法
告诉数据库,我要查询的是多条数据,返回的是一个二维数组。 例:Db::table('sell_5')->get_lists(); get_lists方法必须在查询语句的最后面,因为get_lists前面的方法是生成一条可执行的sql语句,调用get_lists后才会向数据库发起请求;如果不放最后面的话,就会造成位于get_lists后面的方法还没执行到就已经向数据库发起请求了。
get_one()方法
告诉数据库,我要查询的是单条数据,返回的是一个一维数组。 例:Db::table('sell_5')->get_one(); get_one()必须在查询语句的最后面,与get_lists()方法同理。
提醒
三个必须方法构成了一次基本的数据库查询请求,然后配合辅助的非必须的方法,我们就可以查询自己想要的信息了。
可选方法
可选方法使我们的查询更精确,返回我们实际需要的结果。
condition()方法
告诉数据库,我要查询的条件。 例:Db::table('sell_5')->condition("status=3")->get_lists(); condition()方法只有一个参数,如果要查询多个条件,使用原生sql方式组装表达式即可。 例:Db::table('sell_5')->condition("status=3 and catid=10 and areaid=1")->get_lists(); 注意:一条查询表达式中只能使用一次condtion()方法,如果多次使用 后面的会覆盖前面的。 例: Db::table('sell_5')->condition("status=3")->condition("catid=10")->get_lists(); 后面的catid=10会覆盖前面的status=3
where()方法
与condition方法一样,告诉数据库,我要查询的条件。 例:Db::table('sell_5')->where("status=3")->get_lists(); 等同于:Db::table('sell_5')->condition("status=3")->get_lists(); where()方法和condition()功能是一样的,但是where()方法比condition()的使用方式更多,更类似于tinkphp。 在单条件查询时几乎是看不出两者的区别,但在多条件查询时where()的使用简便性就出来了。 例:
//方式一,和condition()一样的用 Db::table('sell_5')->where("status=3 and catid=10 and areaid=1")->get_lists(); //方式二,表达式中多个where()方法 Db::table('sell_5')->where("status=3")->where("catid=10")->where("areaid=1")->get_lists(); //方式三,数组用法 $where[] = "status=3"; $where[] = "catid=10"; $where[] = "areaid=1"; Db::table('sell_5')->where($where)->get_lists();
学会了吗?您觉得是where()方法好用,还是condition()方法好用呢?
我本人习惯用condition()方法,可能是我原生开发时间长了的原故,但是如果您是thinkphp入门的php,可能更容易接受where()方法。
whereor()方法
前面刚学习了where()方法,但是where()方法如果使用方式二和方式三连接多条件时,每个条件之间都是使用 AND 来连接的。如果我们第二个条件和第三件条件是需要用 or 连接怎么办呢? 要么使用condition()方法,要么使用 where()的方式一。但是这两种方式都不习惯使用,于是whereor()方法的用武之地就来了。
例:
$where[] = "status=3"; $where[] = "catid=10"; Db::table('sell_5')->where($where)->whereor("areaid=1")->get_lists();
生成的sql语句
select * from destoon_sell_5 where status=3 and catid=10 or areaid=1
提醒
在查询表达式中,where()、whereor() 不能与condition()共存,condition()会覆盖表达式中的where()和whereor()方法。
在DTapi中与条件构建有关的方法暂时就这三个,并不像其它框架那么多,因为这三个已经够用了,没必要增加一些基本用不上的方法去增加小伙伴们的学习难度。
field()方法
告诉数据库我要查返回哪些字段,每个字段之间用逗号隔开,如果不传该方法,则默认返回所有的字段。
例:
Db::table('sell_5')->field("title,itemid,thumb,price,addtime")->condition("status=3 and catid=10")->get_lists();
order() 方法
告诉数据库我要使用的排序方式
例:
//单个排序条件 Db::table('sell_5')->field("title,itemid,thumb,price,addtime")->condition("status=3 and catid=10")->order("addtime desc")->get_lists(); //多个排序条件,每个之间逗号隔开 Db::table('sell_5')->field("title,itemid,thumb,price,addtime")->condition("status=3 and catid=10")->order("addtime desc,level desc,hits desc")->get_lists();
group()方法
告诉数据库我要使用的分组方式,对应mysql group by
例:
//单个条件 Db::table('sell_5')->field("title,itemid,thumb,price,addtime")->condition("status=3 and catid=10")->group("username")->order("addtime desc,level desc,hits desc")->get_lists(); //多个条件 Db::table('sell_5')->field("title,itemid,thumb,price,addtime")->condition("status=3 and catid=10")->group("username,areaid")->order("addtime desc,level desc,hits desc")->get_lists();
page()方法
指定位置查询,用于分页查询,对应 mysql 的 limit 方法
page()方法有两个参数: page(当前页码,每页数量)
例:
//查询第二页的信息,每页10条 Db::table('sell_5')->page(2,10)->get_lists();
生成的sql 语句
select * from destoon_sell_5 limit 10,10
注意:page()方法的两个参数都是必填参数
cache()方法
缓存设置,用于实时性要求不高的查询,降低mysql的负载。
cache(缓存秒数) 只有一个参数,缓存时间,单位是秒。
例: Db::table('sell_5')->page(2,10)->cache(60)->get_lists();
设置了缓存时间为60秒。
debug()方法
用于输出打印本次链式操作生成的sql语句,调试时使用。
例: Db::table('sell_5')->page(2,10)->cache(60)-debug()->get_lists();
页面会输出:select * from destoon_sell_5 limit 10,10
showpage()方法
用于获取分页,无参数,用来代替destoon原来的
$r = DB::get_one("select count(*) as num from {$DT_PRE}sell_5 where status=3"); $items = $r['num']; $pages = pages($items,$page,$pagesize);
看起来是简单多了。
示例:Db::table('sell_5')->page(2,10)->cache(60)-showpage()->get_lists();
提示:使用了showpage()方法后,在表达式的下面就可以使用 $items 来获取本次查询的总数量。
showpage() 方法只能在使用get_lists()查询列表时才有效,不能用于get_one()
showcat() 方法
用于联查询信息对应的分类称和连接地址,无参数
只有在 destoon的模块主表查询时才会有效,使用了showcat() 方法后,可在模板循环中使用 {$t[catname]} 调用分类名称, {$t[caturl]}调用分类地址
特定条件下才能使用的方法
moduleid()方法
该方法只有在非静态使用Db对像时才有效
例:
//这样用是不行的,会报错 Db::moduleid(5)->get_lists(); //得下面这样用 $db = new Db(); $db->moduleid(5)->get_lists();
moduleid(模块id) 只有一个参数: 模块id
在查询模块主表信息时,可以替换table()方法。
提示:使用moduleid() 方法,必须先new Db() 对像
db() 方法
选择从指定的数据库查询,用于主从分离,多数据库时。
db(数据库id) 一个参数:数据库id
该方法只能在安装了www.dtmoban.com 的主从分离,多从库的插件时才有效。
这是一个收费插件,需要的伙伴可以找作者咨询。