“最难不过坚持”
本人承接扒站仿站,php网站维护,病毒查杀,网站编辑,网站改版,html制作
有需要网站维护,改版,病毒查杀,网站编辑,网站备案,html制作等相关的工作可以联系我。
本人有多年相关工作经验,也可提供免费咨询,交个朋友。
有需要探讨问题的朋友,也可以加我微信,共同探讨!
微信:15011482830 QQ:408917339
- https://jueru.net/
-
- :weixiao:
-
- :shuijiao: :weiqu: :zhenbang: :leng:
-
- :yiwen: :yiwen: :yiwen: :yiwen:
-
- 这个业务逻辑多少都有点奇怪了,阅读浏览次数增值在新闻详情页的控制器方法里setInc,这怎么还写进模型事件里了。如果非要用onAfterRead也可以,把新闻文章的内容单独分出来一个news_content表,然后把它和news做关联,然后给news_content表的onAfterRead事件做增值处理,这样点进新闻页内查询到文章内容时才会触发它。
-
paginate()出来的数据怎样循环插入数据?
paginate()分页如何转数组操作数据之后再转回对象?
thinkphp5 model里面用toarray后怎么分页?
以上类似问题的出现,是因为在model模型中使用了->paginate()分页,由于返回的是对象,所以要把数据转换到数组,才能在模板中循环输出(官网说可以直接使用,我还没搞懂)
一般情况代码过程为:
<?php //model里面的分页函数 public function pageQuery(){ return $this->where($where)->field(true)->order('id desc')->paginate(); } //controller里面调用方法 public function lists(){ $m = new M(); $date = $m->pageQuery(); $lists = $date->toArray();//获得数组 $this->assign('lists', $lists); $page = $date->render();//获得分页 $this->assign('page',$page); return $this->fetch('list'); } ?> <!--模板中使用--> {volist name="lists['Rows']" id="vo" key='i'} {$vo['name']} {/volist} <!--调用分页--> {$page}
但是,如果从数据库调取的数据需要循环处理怎么办呢?比方说增加字段或进行数字加减判断等。
我们可以这样->paginate()->toArray(),然后利用foreach循环,在数据记录里面增加字段等操作,如
foreach ($page['Rows'] as $key => $v){ $page['Rows'][$key]['imgSize'] = round($v['imgSize']/1024/1024,2); }循环之后的数据怎么再转回对象或是利用->render()分页呢?这就比较麻烦了。
官网给出了解决办法https://www.kancloud.cn/manual/thinkphp5/154294
参考官网解决如下
<?php //model里面的分页函数 public function pageQuery(){ $rs = $this->where($where)->field(true)->order('id desc')->paginate() ->each(function($item, $key){ if($item['status']==1){ $item['name1'] = $item['name2']; } $item['imgSize'] = round($item['imgSize']/1024/1024,2); return $item; }); return $rs; } ?>
然后控制器和模板里面还正常使用就行
如果each里面涉及到别的表,则代码如下:
<?php //model里面的分页函数 public function pageQuery(){ $rs = $this->where($where)->field(true)->order('id desc')->paginate() ->each(function($item, $key){ $urs = Db::name('u')->where('isShow',1)->select(); foreach ($urs as $rkey=>$rv){ if($item['userScore']>=$rv['startScore'] && $item['userScore']<$rv['endScore']){ $item['userRank'] = $rv['rankName']; } } return $item; }); return $rs; } ?>
如果each里面涉及到外部参数,则代码如下:
<?php //model里面的分页函数 public function pageQuery(){ //从别的表获得参数值,一次获取,each中可以重复使用 $urs = Db::name('u')->where('isShow',1)->select(); $rs = $this->where($where)->field(true)->order('id desc')->paginate() ->each(function($item, $key) use ($urs){ //使用外部传来的参数$urs foreach ($urs as $rkey=>$rv){ if($item['userScore']>=$rv['startScore'] && $item['userScore']<$rv['endScore']){ $item['userRank'] = $rv['rankName']; } } return $item; }); return $rs; } ?>
传递外部参数,重点在于->each(function($item, $key) use ($urs){ 红色部分
重点介绍请访问http://taotaoit.com/article/details/318.html
20240404
如果不想用或者特殊情况不能用->paginate() ->each这种形式追加数据,怎么办?
1,首先,->paginate()->toArray()是不行的,破坏原有数据结果,前面分页就不能用了。
2,前台分页还能用。参考网址https://blog.csdn.net/longxiao_love/article/details/115029185
$rs = model('shop')->where($where)
->paginate(input('pagesize/d'), false, ['query' => request()->param()]);
$list=$rs->all();
foreach ($list as $key => $v) {
$v['haha'] = '哈哈';
$rs[$key]=$v;
}
dump($rs);
die;