## 示例 查询供应信息 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 的主从分离,多从库的插件时才有效。 这是一个收费插件,需要的伙伴可以找作者咨询。