$course_money=0;foreach($course_arras$key=>$v){$course_money=$course_money+$v->money;}$course_arr是从数据库中查询的多条数据;现目的是算出多条数据中money字段的总和;最终:$course_money 就是最终的总和!
方式一:原生sql查询代码示例:<?php/***CreatedbyPhpStorm.*User:chenzhitao*Date:2017/5/8*Time:下午2:15*/namespaceapp\api\model;usethink\Db;usethink\Exception;classBanner{publicstaticfunctiongetBannerByID($id){$result=Db::query('select*frombanner_itemwherebanner_id=?',[$id]);return$result;}}方式二:使用查询构建器代码示例:<?php/***CreatedbyPhpStorm.*User:chenzhitao*Date:2017/5/8*Time:下午2:15*/namespaceapp\api\model;usethink\Db;usethink\Exception;classBanner{publicstaticfunctiongetBannerByID($id){//1.使用原生sql//$result=Db::query('select*frombanner_itemwherebanner_id=?',[$id]);//return$result;//2.使用查询构建器/**链式查询Db::table('banner_item')->where('banner_id','=',$id)返回查询对象,->select();返回查询结果,*除了select操作还有find(返回一条数据)updatedeleteinsert*对应的where也分三种,1.表达式where('字段名','表达式','查询条件')2.数组发3.闭包。*///2.1表达式法//$result=Db::table('banner_item')//->where('banner_id','=',$id)//->select();//return$result;//2.2闭包法$result=Db::table('banner_item')->where(function($query)use($id){$query->where('banner_id','=',$id);})->select();return$result;}}方式三:ORM(ObjectRelationMapping)对象关系映射使用ORM查询数据库主要区别就是在写模型的继承think\model类,然后控制器就可以使用model的默认方法来获取数据而不是自己再在模型中专门写一个获取方法代码示例:model:<?php/***CreatedbyPhpStorm.*User:chenzhitao*Date:2017/5/8*Time:下午2:15*/namespaceapp\api\model;usethink\Db;usethink\Model;classBannerextendsModel{//publicstaticfunctiongetBannerByID($id){////1.使用原生sql$result=Db::query('select*frombanner_itemwherebanner_id=?',[$id]);return$result;////2.使用查询构建器///*//*链式查询Db::table('banner_item')->where('banner_id','=',$id)返回查询对象,->select();返回查询结果,//*除了select操作还有find(返回一条数据)updatedeleteinsert//*对应的where也分三种,1.表达式where('字段名','表达式','查询条件')2.数组发3.闭包。//*///////2.1表达式法$result=Db::table('banner_item')->where('banner_id','=',$id)->select();return$result;////2.2闭包法//$result=Db::table('banner_item')//->where(function($query)use($id){//$query->where('banner_id','=',$id);////})//->select();//return$result;////////////}}controller:<?php/***CreatedbyPhpStorm.*User:chenzhitao*Date:2017/5/7*Time:下午1:49*/namespaceapp\api\controller\v1;useapp\api\validate\IDMustBePositiveInt;useapp\lib\exception\BannerMissException;useapp\api\model\BannerasBannerModel;classBanner{publicfunctiongetBanner($id){//调用验证器(newIDMustBePositiveInt())->goCheck();//$banner=BannerModel::getBannerByID($id);$banner=BannerModel::get($id);if(!$banner){thrownewBannerMissException();}return$banner;}}
在TP5中发现用不了以前3.X的Create()方法,虽然用input更严谨,但是字段比较多的话还是有些不艺术的3.X中的实现方法如下:$Model=D('User');$Model->create();$Model->add();在仔细阅读了TP5文档后,发现有这么一段:欣喜之余便测试了一下,发现返回的内容是个类,不能直接做修改,只能接着连贯操作:app\category\model\CategoryObject([connection:protected]=>Array()[name:protected]=>Category[table:protected]=>[class:protected]=>app\category\model\Category[pk:protected]=>[error:protected]=>[validate:protected]=>[field:protected]=>Array()[visible:protected]=>Array()[hidden:protected]=>Array()[append:protected]=>Array()[data:protected]=>Array([title]=>dd[sort]=>1[pcid]=>0)[change:protected]=>Array()[auto:protected]=>Array()[insert:protected]=>Array()[update:protected]=>Array()[autoWriteTimestamp:protected]=>[createTime:protected]=>create_time[updateTime:protected]=>update_time[deleteTime:protected]=>delete_time[dateFormat:protected]=>Y-m-dH:i:s[type:protected]=>Array()[isUpdate:protected]=>[updateWhere:protected]=>[relation:protected]=>[failException:protected]=>)仔细看了一下,当中有这么一段是我post的数据:[data:protected]=>Array([title]=>dd[sort]=>1[pcid]=>0)翻看了一下tp5的model类,有这么一个方法:/***获取对象原始数据如果不存在指定字段返回false*@accesspublic*@paramstring$name字段名留空获取全部*@returnmixed*@throwsInvalidArgumentException*/publicfunctiongetData($name=null){if(is_null($name)){return$this->data;}elseif(array_key_exists($name,$this->data)){return$this->data[$name];}else{thrownewInvalidArgumentException('propertynotexists:'.$this->class.'->'.$name);}}调用了一下,果然可以获取到post的数组了。实现代码如下:$data=newCategory($_POST);$data=$data->getData();
field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作。1、用于查询指定字段在查询操作中field方法是使用最频繁的。$Model->field('id,title,content')->select();这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值。执行的SQL相当于:SELECTid,title,contentFROMtable可以给某个字段设置别名,例如:$Model->field('id,nicknameasname')->select();执行的SQL语句相当于:SELECTid,nicknameasnameFROMtable使用SQL函数可以在field方法中直接使用函数,例如:$Model->field('id,SUM(score)')->select();执行的SQL相当于:SELECTid,SUM(score)FROMtable当然,除了select方法之外,所有的查询方法,包括find等都可以使用field方法,这里只是以select为例说明。使用数组参数field方法的参数可以支持数组,例如:$Model->field(array('id','title','content'))->select();最终执行的SQL和前面用字符串方式是等效的。数组方式的定义可以为某些字段定义别名,例如:$Model->field(array('id','nickname'=>'name'))->select();执行的SQL相当于:SELECTid,nicknameasnameFROMtable对于一些更复杂的字段要求,数组的优势则更加明显,例如:$Model->field(array('id','concat(name,'-',id)'=>'truename','LEFT(title,7)'=>'sub_title'))->select();执行的SQL相当于:SELECTid,concat(name,'-',id)astruename,LEFT(title,7)assub_titleFROMtable获取所有字段如果有一个表有非常多的字段,需要获取所有的字段(这个也许很简单,因为不调用field方法或者直接使用空的field方法都能做到):$Model->select();$Model->field()->select();$Model->field('*')->select();上面三个用法是等效的,都相当于执行SQL:SELECT*FROMtable但是这并不是我说的获取所有字段,我希望显式的调用所有字段(对于对性能要求比较高的系统,这个要求并不过分,起码是一个比较好的习惯),那么OK,仍然很简单,下面的用法可以完成预期的作用:$Model->field(true)->select();field(true)的用法会显式的获取数据表的所有字段列表,哪怕你的数据表有100个字段。字段排除如果我希望获取排除数据表中的content字段(文本字段的值非常耗内存)之外的所有字段值,我们就可以使用field方法的排除功能,例如下面的方式就可以实现所说的功能:$Model->field('content',true)->select();则表示获取除了content之外的所有字段,要排除更多的字段也可以:$Model->field('user_id,content',true)->select();//或者用$Model->field(array('user_id','content'),true)->select();2、用于写入除了查询操作之外,field方法还有一个非常重要的安全功能--字段合法性检测(注意:该功能3.1版本开始才能支持)。field方法结合create方法使用就可以完成表单提交的字段合法性检测,如果我们在表单提交的处理方法中使用了:$Model->field('title,email,content')->create();即表示表单中的合法字段只有title,email和content字段,无论用户通过什么手段更改或者添加了浏览器的提交字段,都会直接屏蔽。因为,其他是所有字段我们都不希望由用户提交来决定,你可以通过自动完成功能定义额外的字段写入。同样的,field也可以结合add和save方法,进行字段过滤,例如:$Model->field('title,email,content')->save($data);如果data数据中包含有title,email,content之外的字段数据的话,也会过滤掉。
在项目开发中,我们可能会遇到按时间条件进行查询,比如在获取当月的数据,会获取当月的开始时间$start_month和结束时间$end_monthDb::name("表名")->where('start_time','<=time',$end_month)->where('end_time','>=time',$start_month)->select();where方法支持时间比较,例如:大于某个时间where('create_time','>time','2016-1-1');小于某个时间where('create_time','<time','2016-1-1');时间区间查询where('create_time','betweentime',['2019-1-1','2020-1-1']);使用whereTime方法whereTime方法提供了日期和时间字段的快捷查询,示例如下:大于某个时间Db::table('think_user')->whereTime('birthday','>=','2019-10-1')->select();小于某个时间Db::table('think_user')->whereTime('birthday','select();时间区间查询Db::table('think_user')->whereTime('birthday','between',['2019-10-1','2020-10-1'])->select();不在某个时间区间Db::table('think_user')->whereTime('birthday','notbetween',['2019-10-1','2020-10-1'])->select();时间表达式还提供了更方便的时间表达式查询,例如:获取今天的博客Db::table('cs_blog')->whereTime('create_time','today')->select();获取昨天的博客Db::table('cs_blog')->whereTime('create_time','yesterday')->select();获取本周的博客Db::table('cs_blog')->whereTime('create_time','week')->select();获取上周的博客Db::table('cs_blog')->whereTime('create_time','lastweek')->select();获取本月的博客Db::table('cs_blog')->whereTime('create_time','month')->select();获取上月的博客Db::table('cs_blog')->whereTime('create_time','lastmonth')->select();获取今年的博客Db::table('cs_blog')->whereTime('create_time','year')->select();获取去年的博客Db::table('cs_blog')->whereTime('create_time','lastyear')->select();如果查询当天、本周、本月和今年的时间,还可以简化为:获取今天的博客Db::table('cs_blog')->whereTime('create_time','d')->select();获取本周的博客Db::table('cs_blog')->whereTime('create_time','w')->select();获取本月的博客Db::table('cs_blog')->whereTime('create_time','m')->select();获取今年的博客Db::table('cs_blog')->whereTime('create_time','y')->select();查询一个小时内的博客Db::table('cs_blog')->whereTime('create_time','-1hours')->select();
查询一个数据使用://table方法必须指定完整的数据表名Db::table('think_user')->where('id',1)->find();查询某个字段的值可以用//返回某个字段的值Db::table('think_user')->where('id',1)->value('name');查询某一列的值可以用//返回数组Db::table('think_user')->where('status',1)->column('name');//指定索引Db::table('think_user')->where('status',1)->column('name','id');添加一条数据//使用Db类的insert方法向数据库提交数据$data=['foo'=>'bar','bar'=>'foo'];Db::table('think_user')->insert($data);//如果你在database.PHP配置文件中配置了数据库前缀(prefix),那么可以直接使用Db类的name方法提交数据Db::name('user')->insert($data);添加多条数据//添加多条数据直接向Db类的insertAll方法传入需要添加的数据即可$data=[['foo'=>'bar','bar'=>'foo'],['foo'=>'bar1','bar'=>'foo1'],['foo'=>'bar2','bar'=>'foo2']];Db::name('user')->insertAll($data);更新数据表中的数据Db::table('think_user')->where('id',1)->update(['name'=>'thinkphp']);如果数据中包含主键,可以直接使用:Db::table('think_user')->update(['name'=>'thinkphp','id'=>1]);更新某个字段的值:Db::table('think_user')->where('id',1)->setField('name','thinkphp');删除数据表中的数据//根据主键删除Db::table('think_user')->delete(1);Db::table('think_user')->delete([1,2,3]);//条件删除Db::table('think_user')->where('id',1)->delete();Db::table('think_user')->where('id','<',10)->delete();where语句Db::table('think_user')->where('id','>',1)->where('name','thinkphp')->select();最简单的数组查询方式如下:$map['name']='thinkphp';$map['status']=1;//把查询条件传入查询方法Db::table('think_user')->where($map)->select();表达式查询可以在数组条件中使用查询表达式,例如:$map['id']=['>',1];$map['mail']=['like','%thinkphp@qq.com%'];Db::table('think_user')->where($map)->select();字符串条件使用字符串条件直接查询和操作,例如:Db::table('think_user')->where('type=1ANDstatus=1')->select();aliasalias用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。Db::table('think_user')->alias('a')->join('__DEPT__b','b.user_id=a.id')->select();最终生成的sql语句类似于:SELECT*FROMthink_useraINNERJOINthink_deptbONb.user_id=a.idv5.0.2+版本开始,可以传入数组批量设置数据表以及别名,例如:Db::table('think_user')->alias(['think_user'=>'user','think_dept'=>'dept'])->join('think_dept','dept.user_id=user.id')->select();最终生成的SQL语句类似于:SELECT*FROMthink_useruserINNERJOINthink_deptdeptONdept.user_id=user.id用于查询指定字段field在查询操作中field方法是使用最频繁的。Db::table('think_user')->field('id,title,content')->select();可以给某个字段设置别名,例如:Db::table('think_user')->field('id,nicknameasname')->select();可以在field方法中直接使用函数,例如:Db::table('think_user')->field('id,SUM(score)')->select();字段排除如果我希望获取排除数据表中的content字段(文本字段的值非常耗内存)之外的所有字段值,我们就可以使用field方法的排除功能,例如下面的方式就可以实现所说的功能:Db::table('think_user')->field('content',true)->select();则表示获取除了content之外的所有字段,要排除更多的字段也可以:Db::table('think_user')->field('user_id,content',true)->select();//或者用Db::table('think_user')->field(['user_id','content'],true)->select();order方法属于模型的连贯操作方法之一,用于对操作的结果排序。Db::table('think_user')->where('status=1')->order('iddesc')->limit(5)->select();注意:连贯操作方法没有顺序,可以在select方法调用之前随便改变调用顺序。支持对多个字段的排序,例如:Db::table('think_user')->where('status=1')->order('iddesc,status')->limit(5)->select();如果没有指定desc或者asc排序规则的话,默认为asc。如果你的字段和mysql关键字有冲突,那么建议采用数组方式调用,例如:Db::table('think_user')->where('status=1')->order(['order','id'=>'desc'])->limit(5)->select();limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多。thinkphp的limit方法可以兼容所有的数据库驱动类的。限制结果数量例如获取满足要求的10个用户,如下调用即可:Db::table('think_user')->where('status=1')->field('id,name')->limit(10)->select();limit方法也可以用于写操作,例如更新满足要求的3条数据:Db::table('think_user')->where('score=100')->limit(3)->update(['level'=>'A']);分页查询用于文章分页查询是limit方法比较常用的场合,例如:Db::table('think_article')->limit('10,25')->select();表示查询文章数据,从第10行开始的25条数据(可能还取决于where条件和order排序的影响这个暂且不提)。你也可以这样使用,作用是一样的:Db::table('think_article')->limit(10,25)->select();对于大数据表,尽量使用limit限制查询结果,否则会导致很大的内存开销和性能问题。page利用扩展类库中的分页类Page可以自动计算出每个分页的limit参数,但是如果要自己写就比较费力了,如果用page方法来写则简单多了,例如://查询第一页数据Db::table('think_article')->page('1,10')->select();//查询第二页数据Db::table('think_article')->page('2,10')->select();显而易见的是,使用page方法你不需要计算每个分页数据的起始位置,page方法内部会自动计算。和limit方法一样,page方法也支持2个参数的写法,例如:Db::table('think_article')->page(1,10)->select();//和下面的用法等效Db::table('think_article')->page('1,10')->select();page方法还可以和limit方法配合使用,例如:Db::table('think_article')->limit(25)->page(3)->select();当page方法只有一个值传入的时候,表示第几页,而limit方法则用于设置每页显示的数量,也就是说上面的写法等同于:Db::table('think_article')->page('3,25')->select();groupGROUP方法也是连贯操作方法之一,通常用于结合合计函数,根据一个或多个列对结果集进行分组。group方法只有一个参数,并且只能使用字符串。例如,我们都查询结果按照用户id进行分组统计:Db::table('think_user')->field('user_id,username,max(score)')->group('user_id')->select();生成的sql语句是:SELECTuser_id,username,max(score)FROMthink_scoreGROUPBYuser_id也支持对多个字段进行分组,例如:Db::table('think_user')->field('user_id,test_time,username,max(score)')->group('user_id,test_time')->select();生成的SQL语句是:SELECTuser_id,test_time,username,max(score)FROMthink_scoreGROUPBYuser_id,test_timehavingHAVING方法也是连贯操作之一,用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据。having方法只有一个参数,并且只能使用字符串,例如:Db::table('think_user')->field('username,max(score)')->group('user_id')->having('count(test_time)>3')->select();生成的sql语句是:SELECTusername,max(score)FROMthink_scoreGROUPBYuser_idHAVINGcount(test_time)>3join查询Db::table('think_artist')->alias('a')->join('think_workw','a.id=w.artist_id')->join('think_cardc','a.card_id=c.id')->select();Db::table('think_artist')->alias('a')->join('__WORK__w','a.id=w.artist_id')->join('__CARD__c','a.card_id=c.id')->select();$join=[['think_workw','a.id=w.artist_id'],['think_cardc','a.card_id=c.id'],];Db::table('think_user')->alias('a')->join($join)->select();以上三种写法的效果一样,__WORK__和__CARD__在最终解析的时候会转换为think_work和think_card。注意:'_表名_'这种方式中间的表名需要用大写如果不想使用别名,后面的条件就要使用表全名,可以使用下面这种方式Db::table('think_user')->join('__WORK__','__ARTIST__.id=__WORK__.artist_id')->select();UNION操作用于合并两个或多个SELECT语句的结果集。Db::field('name')->table('think_user_0')->union('SELECTnameFROMthink_user_1')->union('SELECTnameFROMthink_user_2')->select();Db::field('name')->table('think_user_0')->union(['SELECTnameFROMthink_user_1','SELECTnameFROMthink_user_2'])->select();支持UNIONALL操作,例如:Db::field('name')->table('think_user_0')->union('SELECTnameFROMthink_user_1',true)->union('SELECTnameFROMthink_user_2',true)->select();或者Db::field('name')->table('think_user_0')->union(['SELECTnameFROMthink_user_1','SELECTnameFROMthink_user_2'],true)->select();每个union方法相当于一个独立的SELECT语句。注意:UNION内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。distinctDISTINCT方法用于返回唯一不同的值。以下代码会返回user_login字段不同的数据Db::table('think_user')->distinct(true)->field('user_login')->select();生成的sql语句是:SELECTDISTINCTuser_loginFROMthink_user返回以下数组array(2){[0]=>array(1){["user_login"]=>string(7)"chunice"}[1]=>array(1){["user_login"]=>string(5)"admin"}}distinct方法的参数是一个布尔值。lockLock方法是用于数据库的锁机制,如果在查询或者执行操作的时候使用:lock(true);就会自动在生成的sql语句最后加上FORUPDATE或者FORUPDATENOWAIT(oracle数据库)。cachecache方法用于查询缓存操作,也是连贯操作方法之一。cache可以用于select、find、value和column方法,以及其衍生方法,使用cache方法后,在缓存有效期之内不会再次进行数据库查询操作,而是直接获取缓存中的数据,关于数据缓存的类型和设置可以参考缓存部分。下面举例说明,例如,我们对find方法使用cache方法如下:Db::table('think_user')->where('id=5')->cache(true)->find();第一次查询结果会被缓存,第二次查询相同的数据的时候就会直接返回缓存中的内容,而不需要再次进行数据库查询操作。默认情况下,缓存有效期是由默认的缓存配置参数决定的,但cache方法可以单独指定,例如:Db::table('think_user')->cache(true,60)->find();//或者使用下面的方式是等效的Db::table('think_user')->cache(60)->find();表示对查询结果的缓存有效期60秒。当你删除或者更新数据的时候,可以使用cache方法手动更新(清除)缓存,例如:Db::table('think_user')->cache('user_data')->select([1,3,5]);Db::table('think_user')->cache('user_data')->update(['id'=>1,'name'=>'thinkphp']);Db::table('think_user')->cache('user_data')->select([1,5]);最后查询的数据不会受第一条查询缓存的影响,确保查询和更新或者删除使用相同的缓存标识才能自动清除缓存。如果使用find方法并且使用主键查询的情况,不需要指定缓存标识,会自动清理缓存,例如:Db::table('think_user')->cache(true)->find(1);Db::table('think_user')->update(['id'=>1,'name'=>'thinkphp']);Db::table('think_user')->cache(true)->find(1);最后查询的数据会是更新后的数据。commentCOMMENT方法用于在生成的sql语句中添加注释内容,例如:Db::table('think_score')->comment('查询考试前十名分数')->field('username,score')->limit(10)->order('scoredesc')->select();最终生成的SQL语句是:SELECTusername,scoreFROMthink_scoreORDERBYscoredescLIMIT10/*查询考试前十名分数*/fetchSqlfetchSql用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法。例如:$result=Db::table('think_user')->fetchSql(true)->find(1);输出result结果为:SELECT*FROMthink_userwhereid=1forceforce方法用于数据集的强制索引操作,例如:Db::table('think_user')->force('user')->select();对查询强制使用user索引,user必须是数据表实际创建的索引名称。bindbind方法用于手动参数绑定,大多数情况,无需进行手动绑定,系统会在查询和写入数据的时候自动使用参数绑定。bind方法用法如下://用于查询Db::table('think_user')->where('id',':id')->where('name',':name')->bind(['id'=>[10,\PDO::PARAM_INT],'name'=>'thinkphp'])->select();//用于写入Db::table('think_user')->bind(['id'=>[10,\PDO::PARAM_INT],'email'=>'thinkphp@qq.com','name'=>'thinkphp'])->where('id',':id')->update(['name'=>':name','email'=>':email');partitionpartition方法用于是数据库水平分表partition($data,$field,$rule);//$data分表字段的数据//$field分表字段的名称//$rule分表规则注意:不要使用任何SQL语句中会出现的关键字当表名、字段名,例如order等。会导致数据模型拼装SQL语句语法错误。partition方法用法如下://用于写入$data=['user_id'=>110,'user_name'=>'think'];$rule=['type'=>'mod',//分表方式'num'=>10//分表数量];Db::name('log')->partition(['user_id'=>110],"user_id",$rule)->insert($data);//用于查询Db::name('log')->partition(['user_id'=>110],"user_id",$rule)->where(['user_id'=>110])->select();strictstrict方法用于设置是否严格检查字段名,用法如下://关闭字段严格检查Db::name('user')->strict(false)->insert($data);注意,系统默认值是由数据库配置参数fields_strict决定,因此修改数据库配置参数可以进行全局的严格检查配置,如下://关闭严格检查字段是否存在'fields_strict'=>false,如果开启字段严格检查的话,在更新和写入数据库的时候,一旦存在非数据表字段的值,则会抛出异常。failExceptionfailException设置查询数据为空时是否需要抛出异常,如果不传入任何参数,默认为开启,用于select和find方法,例如://数据不存在的话直接抛出异常Db:name('blog')->where(['status'=>1])->failException()->select();//数据不存在返回空数组不抛异常Db:name('blog')->where(['status'=>1])->failException(false)->select();或者可以使用更方便的查空报错//查询多条Db:name('blog')->where(['status'=>1])->selectOrFail();//查询单条Db:name('blog')->where(['status'=>1])->findOrFail();聚合查询count统计数量,参数是要统计的字段名(可选)max获取最大值,参数是要统计的字段名(必须)min获取最小值,参数是要统计的字段名(必须)avg获取平均值,参数是要统计的字段名(必须)sum获取总分,参数是要统计的字段名(必须)获取用户数:Db::table('think_user')->count();//助手函数db('user')->count();或者根据字段统计:Db::table('think_user')->count('id');//助手函数db('user')->count('id');获取用户的最大积分:Db::table('think_user')->max('score');//助手函数db('user')->max('score');获取积分大于0的用户的最小积分:Db::table('think_user')->where('score>0')->min('score');//助手函数db('user')->where('score>0')->min('score');获取用户的平均积分:Db::table('think_user')->avg('score');//助手函数db('user')->avg('score');统计用户的总成绩:Db::table('think_user')->sum('score');//助手函数db('user')->sum('score');时间段查询where方法支持时间比较,例如://大于某个时间where('create_time','>time','2016-1-1');//小于某个时间where('create_time','<=time','2016-1-1');//时间区间查询where('create_time','betweentime',['2015-1-1','2016-1-1']);第三个参数可以传入任何有效的时间表达式,会自动识别你的时间字段类型,支持的时间类型包括timestamps、datetime、date和int。使用whereTime方法whereTime方法提供了日期和时间字段的快捷查询,示例如下://大于某个时间db('user')->whereTime('birthday','>=','1970-10-1')->select();//小于某个时间db('user')->whereTime('birthday','<','2000-10-1')->select();//时间区间查询db('user')->whereTime('birthday','between',['1970-10-1','2000-10-1'])->select();//不在某个时间区间db('user')->whereTime('birthday','notbetween',['1970-10-1','2000-10-1'])->select();时间表达式还提供了更方便的时间表达式查询,例如://获取今天的博客db('blog')->whereTime('create_time','today')->select();//获取昨天的博客db('blog')->whereTime('create_time','yesterday')->select();//获取本周的博客db('blog')->whereTime('create_time','week')->select();//获取上周的博客db('blog')->whereTime('create_time','lastweek')->select();//获取本月的博客db('blog')->whereTime('create_time','month')->select();//获取上月的博客db('blog')->whereTime('create_time','lastmonth')->select();//获取今年的博客db('blog')->whereTime('create_time','year')->select();//获取去年的博客db('blog')->whereTime('create_time','lastyear')->select();如果查询当天、本周、本月和今年的时间,还可以简化为://获取今天的博客db('blog')->whereTime('create_time','d')->select();//获取本周的博客db('blog')->whereTime('create_time','w')->select();//获取本月的博客db('blog')->whereTime('create_time','m')->select();//获取今年的博客db('blog')->whereTime('create_time','y')->select();快捷查询快捷查询方式是一种多字段相同查询条件的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,可以实现下面的查询,例如:Db::table('think_user')->where('name|title','like','thinkphp%')->where('create_time&update_time','>',0)->find();生成的查询SQL是:SELECT*FROM`think_user`WHERE(`name`LIKE'thinkphp%'OR`title`LIKE'thinkphp%')AND(`create_time`>0AND`update_time`>0)LIMIT1快捷查询支持所有的查询表达式。区间查询区间查询是一种同一字段多个查询条件的简化写法,例如:Db::table('think_user')->where('name',['like','thinkphp%'],['like','%thinkphp'])->where('id',['>',0],['<>',10],'or')->find();生成的sql语句为:SELECT*FROM`think_user`WHERE(`name`LIKE'thinkphp%'AND`name`LIKE'%thinkphp')AND(`id`>0OR`id`<>10)LIMIT1区间查询的查询条件必须使用数组定义方式,支持所有的查询表达式。下面的查询方式是错误的:Db::table('think_user')->where('name',['like','thinkphp%'],['like','%thinkphp'])->where('id',5,['<>',10],'or')->find();批量查询可以进行多个条件的批量条件查询定义,例如:Db::table('think_user')->where(['name'=>['like','thinkphp%'],'title'=>['like','%thinkphp'],'id'=>['>',0],'status'=>1])->select();生成的SQL语句为:SELECT*FROM`think_user`WHERE`name`LIKE'thinkphp%'AND`title`LIKE'%thinkphp'AND`id`>0AND`status`='1'闭包查询Db::table('think_user')->select(function($query){$query->where('name','thinkphp')->whereOr('id','>',10);});生成的SQL语句为:SELECT*FROM`think_user`WHERE`name`='thinkphp'OR`id`>10使用Query对象查询也可以事先封装Query对象,并传入select方法,例如:$query=new\think\db\Query;$query->name('user')->where('name','like','%think%')->where('id','>',10)->limit(10);Db::select($query);如果使用Query对象的话,select方法之前调用的任何的链式操作都是无效。混合查询可以结合前面提到的所有方式进行混合查询,例如:Db::table('think_user')->where('name',['like','thinkphp%'],['like','%thinkphp'])->where(function($query){$query->where('id',['<',10],['>',100],'or');})->select();生成的SQL语句是:SELECT*FROM`think_user`WHERE(`name`LIKE'thinkphp%'AND`name`LIKE'%thinkphp')AND(`id`<10or`id`>100)字符串条件查询对于一些实在复杂的查询,也可以直接使用原生SQL语句进行查询,例如:Db::table('think_user')->where('id>0ANDnameLIKE"thinkphp%"')->select();为了安全起见,我们可以对字符串查询条件使用参数绑定,例如:Db::table('think_user')->where('id>:idANDnameLIKE:name',['id'=>0,'name'=>'thinkphp%'])->select();V5.0.4+开始,ThinkPHP支持对同一个字段多次调用查询条件,例如:Db::table('think_user')->where('name','like','%think%')->where('name','like','%php%')->where('id','in',[1,5,80,50])->where('id','>',10)->find();原生查询Db类支持原生SQL查询操作,主要包括下面两个方法:query方法query方法用于执行SQL查询操作,如果数据非法或者查询错误则返回false,否则返回查询结果数据集(同select方法)。使用示例:Db::query("select*fromthink_userwherestatus=1");如果你当前采用了分布式数据库,并且设置了读写分离的话,query方法始终是在读服务器执行,因此query方法对应的都是读操作,而不管你的sql语句是什么。execute方法execute用于更新和写入数据的sql操作,如果数据非法或者查询错误则返回false,否则返回影响的记录数。使用示例:Db::execute("updatethink_usersetname='thinkphp'wherestatus=1");如果你当前采用了分布式数据库,并且设置了读写分离的话,execute方法始终是在写服务器执行,因此execute方法对应的都是写操作,而不管你的SQL语句是什么。参数绑定支持在原生查询的时候使用参数绑定,包括问号占位符或者命名占位符,例如:Db::query("select*fromthink_userwhereid=?ANDstatus=?",[8,1]);//命名绑定Db::execute("updatethink_usersetname=:namewherestatus=:status",['name'=>'thinkphp','status'=>1]);
1.name()方法 作用:指定默认的数据表名(不含前缀) 示例:Db::name('weiba_post'); 返回:Db对象 2.setTable()方法 作用:指定默认数据表名(含前缀) 示例:Db::setTable('op_weiba_post'); 返回:Db对象 3.getTable()方法 作用:得到当前或者指定名称的数据表(有前缀) 示例:Db::getTable('weiba_post');//返回op_weiba_post,带有表前缀,并且转换成了C风格 Db::getTable(); //返回由setTable()设置的表名称(官方所说的是返回"当前"表名称). 返回:表名(字符串) 4.parseSqlTable()方法 作用:将SQL语句中的__TABLE_NAME__字符串替换成带前缀的表名(小写)...此方法一般用不到,主要用于Db类自己调用 示例:Db::parseSqlTable(__WEIBA_POST__);//返回op_weiba_post,带有表前缀,并且转换成了小写 返回:表名(字符串) 5.query()方法 参数: 1.$sql 命令字符串[必填], 2.$bind=[] 绑定参数,默认空数组[选填], 3.$master=false,服务器序号(主从服务器有效),如果数据库没有配置主从服务器.则db类忽略该参数.一般用不到.[选填] 4.$class=false返回值处理方式.默认直接返回 true:PDO对象 类名:当前类处理 '' :不做任何处理.直接返回 作用:执行查询返回数据集(查询) 示例:Db::query($sql); //返回查询结果 返回:返回查询结果(数组或对象)6.execute()方法 参数: $sql,$bind=[],$getLastInsID=false,$sequence=null 1.$sql 命令字符串[必填], 2.$bind=[] 绑定参数,默认空数组[选填], 3.$getLastInsID=false 是否返回上次插入的ID.如果true则返回上次上次插入ID.false返回影响行数.默认为false.[选填] 4.$sequence=null如果没有为参数sequence指定序列名称,则返回一个表示最后插入数据库那一行的行ID的字符串。如果为参数sequence指定了序列名称,则返回一个表示从指定序列对象取回最后的值的字符串。如果当前PDO驱动不支持此功能,则触发一个IM001SQLSTATE。 作用:执行语句(编辑) 示例:Db::execute($sql);//返回一个整型的数字 返回:返回编辑结果, 7.getLastInsID()方法 作用:获取最近插入的ID 示例:$id=Db::getLastInsID() 返回:ID 8.getLastSql()方法 作用:获取最近一次查询的sql语句 示例:$sql=Db::getLastSql() 返回:sql命令,字符串类型 9.transaction()方法 php好强大... 参数:1.$callback,回调函数[可选] 作用:执行数据库事务,回调函数执行成功则提交事务,否则回滚 示例:Db::transaction($this->update($data)); 返回:回调函数的返回值 10.startTrans()方法 作用:开启事务 示例:Db::startTrans() 返回:失败返回假,成功无返回值,注意false跟null的区别(===) 11.commit()方法 作用:用于非自动提交状态下面的查询提交 示例:Db::commit() 返回:无返回值 12.rollback()方法 作用:事务回滚 示例:Db::rollback(); 返回:无返回值 13.batchQuery()方法 参数:就一个.类型必须是数组.否则直接返回假 作用:批处理执行SQL语句,强制认为是编辑操作,内部启动了事务.也就是说要么都成功.要么都失败(失败会抛出一个异常) 示例:Db::batchQuery($arr);//参数是sql命令数组 返回:总是返回true 14.getConfig()方法 作用:返回数据库配置参数 示例:$config=Db::getConfig(); 返回:配置信息 15.getPartitionTableName()方法 作用:得到分表的的数据表名(用到再说吧.说不定要改写.) 示例: 返回:表名 16.value()方法 参数:1.字段.2默认值 作用:得到某个字段的值 示例:Db::table('op_user')->value('uid',false); 作用:得到某个字段的值 17.column()方法 参数: 1.字段名.多个用逗号隔开[必填] 2.索引字段[选填] 作用:得到某个列的数组 示例:不想写 作用:这就是value()方法组团来的... 18.count()方法 参数:他的参数默认是*,建议以后使用的时候用0 作用:COUNT查询,数量 示例:Db::table('op_user')->count(0); 返回:数量 19.sum()方法 参数:默认是*.建议改 作用:求和 示例:Db::table('op_user')->sum('uid'); //uid的总数,好神奇的需求... 返回:数量 20.min()方法 参数:默认是*.建议改 作用:求最小值 示例:Db::table('op_user')->min(`uid`); //最小uid 返回:字段值 21.max()方法 参数:默认是*.建议改 作用:求最大值 示例:Db::table('op_user')->max(`uid`); //最大uid 返回:字段值 22.avg()方法 参数:默认是*.建议改 作用:求平均值 示例:Db::table('op_user')->avg(`uid`); //最大uid 返回:字段值 23.setField()方法 参数:可以是数组,也可以是字符串 作用:修改某一字段的值(内部调用的update) 示例: Db::table('op_user')->where(['uid'=>1])->setField('phone','110'); Db::table('op_user')->where(['uid'=>1])->setField(['phone'=>'110']); 返回:影响行数 24.setInc()方法 参数: 1.$field:同setField().归根结底还是调用的update 2.$step:增长值 3.$lazyTime:延迟时间,大于0时才延迟 作用:延迟更新.保存在缓存中.Db类自动调用. 25.setDec()方法 参数: 1.$field:同setField().归根结底还是调用的update 2.$step:减少值 3.$lazyTime:延迟时间,大于0时才延迟 作用:同setInc()方法 26.join()方法 参数: 1.表名,支持__WEIBA_POST__, 2.on条件.可以是字符串.也可以是数组.如果是数组连接用的and. 3.join类型.left,right,inner 注意.如果只传一个参数,必须为数组.格式就是上面的三个值,否则报错. 作用:关联查询 示例: Db::table('aa')->join('__BB__','aa.id=bb.idandaa.name=bb.name','left'); //aaleftjoinbbonaa.id=bb.idandaa.name=bb.name Db::table('aa')->join('bb',['aa.id=bb.id','aa.name=bb.name'],'left'); aaleftjoinbbonaa.id=bb.idandaa.name=bb.name Db::table('op_userasu')->field('u.uid')->join(['op_bz_binzhouq'=>'q'],'u.uid=q.uid','left')->select(); //SELECTu.uidFROMop_userasuLEFTJOINop_bz_binzhouqqONu.uid=q.uid 27.union()方法 参数: 1.$union,可以是数组,也可以是字符串 2.$all,有值UNIONALL,否则为UNION 作用:合并结果集 示例:Db::union($union,true); 28.field()方法 参数: 1.$field:true全部字段,字符串(自动去重) 2.真假,是否去重,如果$field是全部字符串(true)时,不支持去重. 3.$tableName:表名.会组成$tableName.$field的形式 后面还有俩参数...用不到了... 作用:指定field字段 示例:Db::field('id,name',0,'user')->field('pid,pname,psex',0,'ping')//user.id,user.name,ping.pid,ping.pname,ping.psex 29.view()方法 参数: 1.$join:表名 2.$field:字段名 3.$on:关联条件,同join方法 4.$type:关联类型.left.right 作用:该方法设置的字段会在前面加上表 示例: Db::table('user')->field('uid',0,'user')->view('binzhour','name','user.uid=binzhour.uid','left')->select(); //select`user`.`uid`,`binzhour`.`name`from`user`leftjoin`binzhour`on`user`.`uid`=`binzhour`.`uid`; 30.partition()方法 参数: 1.data, 2.field, 3.rule[可选] 作用:设置分表规则,内部调用的getPartitionTableName()方法 示例:见getPartitionTableName方法 31.where()方法 参数: 1.field查询字段 2.op[可选]查询表达式 3.condition查询条件 作用:指定AND查询条件.内部调用的parseWhereExp()方法, 示例:详见parseWhereExp()方法 32.whereOr()方法 参数:同where()方法 作用:指定OR查询条件.与where唯一不同的是用or连接.内部调用的parseWhereExp()方法 示例:详见parseWhereExp()方法33.whereXor()方法 参数:同where()方法 作用:异或,两边布尔值相同为假.不同为真.内部调用的parseWhereExp()方法 示例:详见parseWhereExp()方法34.limit()方法 参数: 1.起始位置 2.查询数量 作用:指定查询数量 示例:limit(0,20); 35.page()方法 参数: 1.页数[必选] 2.每页数量,[可选20]. 作用:指定分页 示例:page(1,20); //第一页.每页20条. 36.table()方法 参数: 1.表名 作用:指定当前操作的数据表 示例:table('tableName') 37.using()方法(不知道用法...) 参数: 1.字段名 作用:USING支持 示例:selecta.*,b.*fromaleftjoinbusing(colA);等同于selecta.*,b.*fromaleftjoinbona.colA=b.colA; 38.order()方法 参数: 1.字段名 2.排序 作用:排序 示例:order('id','desc')或者order(['id'=>'desc','create_time'=>'desc']) 39.cache()方法 参数: 1.缓存KEY. 2.缓存有效期. 作用:查询缓存 返回对象... 示例:cache('id',10) 40.group()方法 参数:1.字段名 作用:分组查询 示例: 41.having()方法 42.distinct()方法 43.alias()方法.别名 44.force()方法 参数:索引名 作用:强制使用索引,不使用其他索引 45.comment()方法 参数:注释内容 作用:给sql命令写注释. 示例:Db::name('bz_live')->comment('好无聊的方法')->find();等同于SELECT*FROM`op_bz_live`LIMIT1 /*好无聊的方法*/ 46.fetchSql()方法 参数:写true 作用:返回sql语句 示例:$sql=Db::name('bz_live')->fetchSql(true)->select(); 47.fetchPdo()方法 参数:写true 作用:返回PDOStatement对象 示例:Db::name('bz_live')->fetchPdo(true)->select(); 48.strict()方法 参数:true/false 作用:是否严格检查字段名 示例: 49.failException()方法 参数:true/false 作用:设置查询数据不存在是否抛出异常
<?php//命名空间namespaceapp\index\controller;useapp\admin\controller\Deer;classUser{publicfunctionfunc(){echo'index模块,User控制器,func方法';}publicfunctiontest(){//一、调用相同模块下的不同控制器//1.直接new类,创建对象,调用方法$p=newRabit();$p->carrot();echo'<hr>';//2.系统方法对象=controller(‘控制器名’),调用方法$p=controller('Rabit');$p->carrot();echo'<hr>';//二、调用不同模块下的控制器//1.系统方法对象=controller('模块名/控制器名'),调用方法$p=controller('admin/Deer');$p->grass();echo'<hr>';//2.使用命名空间$p=new\app\admin\controller\Deer;$p->grass();echo'<hr>';//3.使用面向对象,跨模块需要引文件$p=newDeer;$p->grass();}publicfunctiontest2(){//一、调用相同控制器下不同方法(对象调用,本身调用,类调用,系统方法调用)$this->func();self::func();User::func();action('func');//二、调用相同模块下不同控制器下方法//1.系统方法对象=action('控制器路径/方法名')$p=action('Rabit/carrot');//2.类调用$p=newRabit;$p->carrot();//三、调用不同模块下控制器的方法//1.系统方法调用action('admin/Deer/grass');//2.命名空间调用$p=new\app\admin\controller\Deer;$p->grass();}}?>注意:命名空间使用反斜杠\系统方法调用则为路径,(控制器/方法名)为路径的正斜杠。
tp5给某个字段增加减少值减少:Db::name('song')->where('id',$song_id)->setDec('song_number',5);//给song_number减少5增加:Db::name('song')->where('id',$song_id)->setInc('song_number',5);//给song_number增加10
今天跟大家分享一下微信小程序的授权登录接口,其实是上也没有什么东西,上代码。$appid='自己的APPid';$secret='自己的秘钥';//前端获取的code码$code=input('code');if(!$code){echojson_encode(array('status'=>0,'err'=>'非法操作!'));exit();}$get_token_url="https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$secret."&js_code=".$code."&grant_type=authorization_code";//开启会话获取openid$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$get_token_url);curl_setopt($ch,CURLOPT_HEADER,0);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);$price=curl_exec($ch);curl_close($ch);echo$price;exit();开启会话获取到openid,返回前端通过openid返回微信用户的头像、名称,然后进行数据库存储;$openid=input('openid');$name=input('name');$img=input('img');if(!$openid){echojson_encode(array('status'=>0,'err'=>"授权失败!"));exit();}$con['openid']=trim($openid);$uid=Db::name('表名')->where($con)->field('id')->find();if($uid){echojson_encode(array('status'=>2,'msg'=>'请求成功','userid'=>$uid['id']));exit();}else{$data['name']=$name;$data['img']=$img;$data['openid']=$openid;$data['create_time']=date("Y-m-dH:i:s");$res=Db::name('user')->insert($data);$userid=Db::name('user')->getLastInsID();if($res){$insert=array();$insert['id']=$userid;echojson_encode(array('status'=>1,'msg'=>'请求成功','data'=>$insert));exit();}else{echojson_encode(array('status'=>0,'err'=>'授权失败!'));exit();}}