如果你需要单独获取总的数据,可以使用//查询状态为1的用户数据并且每页显示10条数据$list=User::where('status',1)->paginate(10);//获取总记录数$count=$list->total();//把分页数据赋值给模板变量list$this->assign('list',$list);//渲染模板输出return$this->fetch();分页后的数据如何修改?$list=db('user')->paginate(20,false,['query'=>request()->param()])->each(function($item,$key){//可做其他数据库查询数据来修改item$item['age']=18;return$item;});$this->assign("list",$list->all());
url优化可是网站开发的必备高阶技能,先看本实例优化前后效果比较:(同为调用前台模块下的index控制器下的index方法)优化前:www.zhansanjie.com/tp5/public/index.php/index/index/index。优化后:www.zhansanjie.com/t。可以优化这么多?对,就是能优化成这样!是不是感觉最后效果很棒哦,来跟我一起做吧,你也网站也可以这样哦!优化步骤1.修改网站文件,将url简化为(www.zhansanjie.com/public/index.php/index/index/index)2.配置tp5文件,将url简化为(www.zhansanjie.com/index.php/index/index/index)3.绑定前后台模块(即路由绑定),将url简化为(www.zhansanjie.com/index.php/t)4.配置虚拟主机,实现隐藏入口文件,将url简化为(www.zhansanjie.com/t)(若可配合tp5官方文档学习,效果更优,本文为升级版的服务器端url优化,与本地优化方法相似)接下来逐步讲解:一、修改网站文件,将url简化为(www.zhansanjie.com/public/index.php/index/index/index)1.将tp5文件夹下内容全部剪切移动到网站www.zhansanjie.com的根目录。2.删去tp5空文件夹。二、配置tp5文件,将url简化为(www.zhansanjie.com/index.php/index/index/index)1.将public下的两个文件:index.php和.htaccess两个文件剪切移动到网站www.zhansanjie.com的根目录。2.修改文件index.php为://[应用入口文件]23//定义应用目录4define('APP_PATH',__DIR__.'/application/');5//绑定前台6define('BIND_MODULE','index');7//加载框架引导文件8require__DIR__.'/thinkphp/start.php';其实就是将4行和6行内的'../'删去三、绑定前后台模块,将url简化为(www.zhansanjie.com/index.php/t)(绑定方法有很多可以通过tp5官方文档详细了解)我推荐使用批量注册的方法绑定:目标文件:application/route.php先注释掉文件内的原有代码然后写入如下代码://引入系统类usethink\Route;//定义路由规则Route::rule(['/t'=>'index/index/test',],'','get|post');四、配置虚拟主机,实现隐藏入口文件,将url简化为(www.zhansanjie.com/t)1.修改apache配置(1)找到apache下的所有httpd.conf配置文件(2)找到rewrite_modulemodules/mod_rewrite.so去掉前面的注释(3)在配置文件中,AllowOverrideNone将所有None全部改为All(4)搜索DocumentRoot 将根目录设置成你的入口文件那个目录,我的是DocumentRoot "F:\phpStudy\WWW\thinkphp5\public"2.修改网站根目录下的.htaccess文件为<IfModulemod_rewrite.c>Options+FollowSymlinks-MultiviewsRewriteEngineOnRewriteCond%{REQUEST_FILENAME}!-dRewriteCond%{REQUEST_FILENAME}!-fRewriteRule^(.*)$index.php?/$1[QSA,PT,L]</IfModule>其实只是做了一个小修改,将原文件倒数第二行 RewriteRule^(.*)$index.php/$1[QSA,PT,L]改成了 RewriteRule^(.*)$index.php?/$1[QSA,PT,L]就添加了一个‘?’而已3.改完配置后,重启apache五、完全Ok啦,使用www.zhansanjie.com/t作为api入口吧!
//当天数据$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;$map['create_time']=array('between',array($beginToday,$endToday));//昨天数据$beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));$endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;$map['create_time']=array('between',array($beginYesterday,$endYesterday));//按日期和分类分组查询//create_time字段在数据库里为时间戳$list=M('user')->where($map)->field("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d')asdate,count(*)astotal,type")->group("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d'),type")->select();$list=array_reverse($list);//ip地址过滤$distinct_click_ip_list=M('user')->where(array('type'=>1))->field("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d')asdate,count(distinctcreate_ip)asdistinct_total,type")->group("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d'),type")->select();
代码示例如下:有不好的地方希望大家讨论、留言。<?phpnamespaceapp\home\model;usethink\Controller;usethink\Db;/***MYSQL模型*/classMysqlextendscontroller{//获取一条数据publicfunctiongetFind($table,$where=array(),$field='',$order='iddesc'){$result=Db::name($table)->where($where)->field($field)->order($order)->find();return$result;}//更新数据publicfunctiongetUpdate($table,$where=array(),$params){$result=Db::name($table)->where($where)->update($params);return$result;}//插入一条数据返回idpublicfunctiongetInsertGetId($table,$params){$result=Db::name($table)->insertGetId($params);return$result;}//查询多条数据publicfunctiongetSelect($table,$where=array(),$field='',$order='iddesc'){$result=Db::name($table)->where($where)->order($order)->field($field)->select();return$result;}//查询有限制数据publicfunctiongetLimitSelect($table,$where=array(),$field='',$order='iddesc',$limit){$result=Db::name($table)->where($where)->order($order)->field($field)->limit($limit)->select();return$result;}//数据分页publicfunctiongetPageSelect($table,$where=array(),$page=0,$pageSize=10,$order='iddesc',$field=''){$result=Db::name($table)->where($where)->order($order)->field($field)->page($page,$pageSize)->select();return$result;}//删除数据publicfunctiongetDelete($table,$where=array()){$result=Db::name($table)->where($where)->delete();return$result;}//插入多条数据publicfunctiongetInsertAll($table,$data){$result=Db::name($table)->insertAll($data);return$result;}//两表连接查询publicfunctionTwoSelectJoin($table1,$table2,$condition,$where=array(),$field='',$order=array('t1.iddesc')){$result=Db::name($table1.'t1')->join($table2.'t2',$condition)->where($where)->order($order)->field($field)->select();return$result;}//两表连接查询publicfunctionTwoFindJoin($table1,$table2,$condition,$where=array(),$field='',$order=array('t1.iddesc')){$result=Db::name($table1.'t1')->join($table2.'t2',$condition)->where($where)->order($order)->field($field)->find();return$result;}//三表连接查询publicfunctionThreeSelectJoin($table1,$table2,$table3,$condition1,$condition2,$where=array(),$field='',$order=array('t1.iddesc')){$result=Db::name($table1.'t1')->join($table2.'t2',$condition1)->join($table3.'t3',$condition2)->where($where)->order($order)->field($field)->select();return$result;}//三表连接查询publicfunctionThreeFindJoin($table1,$table2,$table3,$condition1,$condition2,$where=array(),$field='',$order=array('t1.iddesc')){$result=Db::name($table1.'t1')->join($table2.'t2',$condition1)->join($table3.'t3',$condition2)->where($where)->order($order)->field($field)->find();return$result;}//统计某表某字段publicfunctiongetSum($table,$where=array(),$field){$result=Db::name($table)->where($where)->sum($field);return$result;}//统计某表记录数publicfunctiongetCount($table,$where=array()){$result=Db::name($table)->where($where)->count();return$result;}//查询某列查询publicfunctiongetColumn($table,$where=array(),$field='',$order='iddesc'){$result=Db::name($table)->where($where)->order($order)->column($field);return$result;}//查询单个字段值publicfunctiongetValue($table,$where=array(),$value){$result=Db::name($table)->where($where)->value($value);return$result;}//查询某个字段publicfunctiongetOrderValue($table,$where=array(),$value){$result=Db::name($table)->where($where)->value($value);return$result;}//查询锁定表(队列,阻止并发)publicfunctiongetLockValue($table,$where=array(),$value,$order='iddesc'){$result=Db::name($table)->where($where)->lock(true)->value($value);return$result;}}
一、在tp5/common.php中添加以下文件functionsubtext($text,$length){if(mb_strlen($text,'utf8')>$length)returnmb_substr($text,0,$length,'utf8').'…';return$text;}二、在前端配合volist循环输出模版即可:{$vo.title|subtext=16}subtext=16,这里的数字就是你所需要的字符串长度
Thinkphp下开启gzip压缩很简单,不管你是哪个版本,只要在你的入口文件index.PHP中加入以下两行,如果你的服务器支持,那么就OK了。define("GZIP_ENABLE",function_exists('ob_gzhandler'));ob_start(GZIP_ENABLE?'ob_gzhandler':null);例如:thinkphp3.0开启gzip压缩<?phpdefine('APP_NAME','admin');define('APP_PATH','./admin/');define('APP_DEBUG',true);define("GZIP_ENABLE",function_exists('ob_gzhandler'));ob_start(GZIP_ENABLE?'ob_gzhandler':null);require'./ThinkPHP/ThinkPHP.php';可以访问站长之家检查是否启用成功
1、update方法总结/***设置记录的某个字段值*支持使用数据库字段和方法*@accesspublic*@paramstring|array$field字段名*@parammixed$value字段值*@returninteger*/functionsetField($field,$value=''){};//设置某个字段的值,适用场景:适用于用户积分清零、余额清零等类似操作Db::name('table')->where('id',1)->setField('field',0);/***字段值(延迟)增长*@accesspublic*@paramstring$field字段名*@paraminteger$step增长值*@paraminteger$lazyTime延时时间(s)*@returninteger|true*@throwsException*/publicfunctionsetInc($field,$step=1,$lazyTime=0){};//自增某个字段的值,参数2不传时默认为自增1,适用场景:适用于用户积分增加、余额增加等类似操作,需要延时更新则传入第三个参数(单位秒),Db::name('table')->where('id',1)->setInc('field',2);/***字段值(延迟)减少*@accesspublic*@paramstring$field字段名*@paraminteger$step减少值*@paraminteger$lazyTime延时时间(s)*@returninteger|true*@throwsException*/publicfunctionsetDec($field,$step=1,$lazyTime=0){};//自减某个字段的值,参数2不传时默认为自减1,适用场景:适用于用户积分扣除、余额扣除等类似操作,需要延时更新则传入第三个参数(单位秒),Db::name('table')->where('id',1)->setDec('field',2);/***使用表达式设置数据*@accesspublic*@parammixed$value表达式*@returnExpression*/publicfunctionraw($value){};//自增或自减多个字段的值,raw方法内支持SQL函数,适用场景:适用于同时更新用户累计余额、当前余额等类似操作Db::name('table')->where('id',1)->update(['total_remain'=>Db::raw("total_remain+100"),'remain'=>Db::raw("remain+100"),]);2、select方法总结/***得到某个字段的值*@accesspublic*@paramstring$field字段名*@parammixed$default默认值*@parambool$force强制转为数字类型*@returnmixed*/publicfunctionvalue($field,$default=null,$force=false){};//查询某个字段的值,参数1支持SQL函数,适用场景:适用于获取用户余额、积分、名称等类似操作Db::name('table')->where('id',1)->value('field');//参数1为SQL函数时,如下、相当于使用TP5聚合查询Db::name('table')->where('id',1)->value('COUNT(*)ascount')['count'];//统计符合查询条件数据的行数Db::name('table')->where('id',1)->value('MAX(field)asmax')['max'];//获取符合查询条件数据的最大值Db::name('table')->where('id',1)->value('MIN(field)asmin')['min'];//获取符合查询条件数据的最小值Db::name('table')->where('id',1)->value('AVG(field)asavg')['avg'];//获取符合查询条件数据的平均值Db::name('table')->where('id',1)->value('SUM(field)assum')['sum'];//获取符合查询条件数据的总和值/***得到某个列的数组*@accesspublic*@paramstring$field字段名多个字段用逗号分隔*@paramstring$key索引*@returnarray*/publicfunctioncolumn($field,$key=''){};//查询某一列的值,适用场景:适用于获取关联订单商品ID、用户所有店铺ID、获取班级所有学生姓名等类似操作Db::name('table')->where('order_id',1)->column('field');/***COUNT查询*@accesspublic*@paramstring$field字段名*@returninteger|string*/publicfunctioncount($field='*'){};//统计符合查询条件数据的行数,适用场景:适用于获取用户未读消息数量等类似操作Db::name('table')->where('status',1)->count();/***SUM查询*@accesspublic*@paramstring$field字段名*@returnfloat|int*/publicfunctionsum($field){};//获取符合查询条件数据的总和值,适用场景:适用于获取用户总支出、总收入金额等类似操作Db::name('table')->where('pay_type',1)->sum();/***MIN查询*@accesspublic*@paramstring$field字段名*@parambool$force强制转为数字类型*@returnmixed*/publicfunctionmin($field,$force=true){};//获取符合查询条件数据的最小值,适用场景:适用于获取积分排名最后的用户等类似操作Db::name('table')->where('status',1)->min();/***MAX查询*@accesspublic*@paramstring$field字段名*@parambool$force强制转为数字类型*@returnmixed*/publicfunctionmax($field,$force=true){}; //获取符合查询条件数据的最大值,适用场景:适用于获取积分排名第一的用户等类似操作Db::name('table')->where('status',1)->max();/***AVG查询*@accesspublic*@paramstring$field字段名*@returnfloat|int*/publicfunctionavg($field){};//获取符合查询条件数据的平均值,适用场景:适用于班级平均分等类似操作Db::name('table')->where('status',1)->avg();3、insert方法总结$insert=[['order_id'=>1,'goods_id'=>1,'attr_id'=>1],['order_id'=>1,'goods_id'=>1,'attr_id'=>1],['order_id'=>1,'goods_id'=>1,'attr_id'=>1]];//插入多条数据,适用场景:适用于用户购买商品记录订单商品信息等类似操作Db::name('table')->insertAll($insert);$insert=['order_id'=>1,'goods_id'=>1,'attr_id'=>1];//插入一条数据并返回自增列值,适用场景:适用于用户购买商品生成订单后记录订单关联信息时获取生成订单的自增ID等类似操作Db::name('table')->insertGetId($insert);4、链式查询//往分页查询的结果集内添加数据,适用于需要使用关联表查询到的数据再做另外的查询并存入数据集$model->where('o.status<>6')->order('iddesc')->paginate()->each(function($item){$service_ids=Db::name('order_service')->where('order_id',$item['id'])->column('service_id');$service_names=Db::name('service')->where('id','in',$service_ids)->column('name');$item['service_names']=implode(',',$service_names);return$item;});//获取分页查询结果集内的全部数据,适用于需要使用分页数据内的某些数据再做另外的查询$list=$model->where('o.status',0)->where('o.pay_status',0)->order('o.iddesc')->paginate();//分页查询$data=$list->toArray();//获取分页查询结果集合并将结果集合转换为数组(包含分页信息)
1.控制器中调试Sql语句:在模型中我们可以通过User::getLastSql()来打印Sql语句。在一些API控制器中我们一般不会去写模型,所以可以采取链式调用的方法来实现。dump(Db::name('tablename')->getLastSql());//查询当前表的最后一次sql语句。2.Db::name/Db::table和db的区别Db::name('user')->where(['id'=>1])->select();//数据库中的表名为fa_userDb::table()使用这个必须指定完整的表名Db::tale('fa_user')->where(['id'=>1])->select();//数据库中的表名为fa_userdb(’’)是助手函数,注意此助手函数,每次都会重新连接mysql!!所以这个助手函数少使用。db('user')->where(['id'=>1])->select();//数据库中的表名为fa_usermysql会计统计某个字段的重复数量selectip,count(*)fromtablenameGroupbyipORDERBY`count(*)`DESC
//删除publicfunctiondelete($id){$message="删除失败";$imgurl=Db::name('imgfile')->where('id',$id)->value('url');if(empty($imgurl)){#code...}else{$url=$_SERVER["DOCUMENT_ROOT"].json_decode($imgurl);//halt($url);if(model('Imgfile')->destroy($id)){unlink($url);$message="已删除";}}return$message;}//批量删除publicfunctiondelall(){$status=0;$message="删除失败";$data=$this->request->param();$allid=$data['id'];$ids='';foreach($allidas$k=>$value){$ids[$k]=$value;$imgurl[$k]=Db::name('imgfile')->where('id',$value)->value('url');}$num=count($allid);if(model('Imgfile')->destroy($ids)){foreach($imgurlas$key=>$val){$url[$key]=$_SERVER["DOCUMENT_ROOT"].json_decode($imgurl[$key]);unlink($url[$key]);}$status=1;$message="删除成功";}return['status'=>$status,'message'=>$message,'num'=>$num];}
使用模型查询的返回的结果集为对象,其中里面的数据,TP5框架会自动对里面的data:protected该项进行处理。但有时我们就想要数据,就想返回一个数组就可以了,怎么办?有两种方法可以实现:方法一:找到TP5框架中的database.php文件,该文件中找到resultset_type该项,将后面的array改成hinkCollection【注意大小写】//数据集返回类型'resultset_type'=>'array',改为//数据集返回类型'resultset_type'=>'hinkCollection',在查询数据的时候,在后面加上->toArray();例如:$data=User::select()->toArray();方法二:在模型里设置首先在Model中添加该属性:protected$resultSetType='collection';在查询数据的时候,在后面加上->toArray();例如:$data=User::select()->toArray();tp5输出的数组如何放到js里使用直接使用会报错,必须要转换:vararr={:json_encode($user)};console.log(arr)输出打印结果如下:(2)[{…},{…}]