paginate()出来的数据怎样循环插入数据?
paginate()分页如何转数组操作数据之后再转回对象?
thinkphp5 model里面用toarray后怎么分页?
需要先修改Paginator.php里的文件.
1 /** 2 * 给每个元素执行个回调 3 * 4 * @param callable $callback 5 * @return $this 6 */ 7 public function each(callable $callback) 8 { 9 foreach ($this->items as $key => $item) { 10 $this->items[$key] = $callback($item, $key); 11 if ($callback($item, $key) === false) { 12 break; 13 } 14 } 15 16 return $this; 17 }
以上类似问题的出现,是因为在model模型中使用了->paginate()分页,由于返回的是对象,所以要把数据转换到数组,才能在模板中循环输出(官网说可以直接使用,我还没搞懂)
一般情况代码过程为:
1 <?php 2 //model里面的分页函数 3 public function pageQuery(){ 4 return $this->where($where)->field(true)->order('id desc')->paginate(); 5 } 6 7 //controller里面调用方法 8 public function lists(){ 9 $m = new M(); 10 $date = $m->pageQuery(); 11 $lists = $date->toArray();//获得数组 12 $this->assign('lists', $lists); 13 $page = $date->render();//获得分页 14 $this->assign('page',$page); 15 16 return $this->fetch('list'); 17 } 18 ?> 19 <!--模板中使用--> 20 {volist name="lists['Rows']" id="vo" key='i'} 21 {$vo['name']} 22 {/volist} 23 <!--调用分页--> 24 {$page}
但是,如果从数据库调取的数据需要循环处理怎么办呢?比方说增加字段或进行数字加减判断等。
我们可以这样->paginate()->toArray(),然后利用foreach循环,在数据记录里面增加字段等操作,如
1 foreach ($page['Rows'] as $key => $v){ 2 $page['Rows'][$key]['imgSize'] = round($v['imgSize']/1024/1024,2); 3 }
循环之后的数据怎么再转回对象或是利用->render()分页呢?这就比较麻烦了。
官网给出了解决办法https://www.kancloud.cn/manual/thinkphp5/154294
参考官网解决如下
1 <?php 2 //model里面的分页函数 3 public function pageQuery(){ 4 $rs = $this->where($where)->field(true)->order('id desc')->paginate() 5 ->each(function($item, $key){ 6 if($item['status']==1){ 7 $item['name1'] = $item['name2']; 8 } 9 $item['imgSize'] = round($item['imgSize']/1024/1024,2); 10 return $item; 11 }); 12 return $rs; 13 } 14 ?>
然后控制器和模板里面还正常使用就行
如果each里面涉及到别的表,则代码如下:
1 <?php 2 //model里面的分页函数 3 public function pageQuery(){ 4 $rs = $this->where($where)->field(true)->order('id desc')->paginate() 5 ->each(function($item, $key){ 6 $urs = Db::name('u')->where('isShow',1)->select(); 7 foreach ($urs as $rkey=>$rv){ 8 if($item['userScore']>=$rv['startScore'] && $item['userScore']<$rv['endScore']){ 9 $item['userRank'] = $rv['rankName']; 10 } 11 } 12 return $item; 13 }); 14 return $rs; 15 } 16 ?>
如果each里面涉及到外部参数,则代码如下:
1 <?php 2 //model里面的分页函数 3 public function pageQuery(){ 4 //从别的表获得参数值,一次获取,each中可以重复使用 5 $urs = Db::name('u')->where('isShow',1)->select(); 6 $rs = $this->where($where)->field(true)->order('id desc')->paginate() 7 ->each(function($item, $key) use ($urs){ 8 //使用外部传来的参数$urs 9 foreach ($urs as $rkey=>$rv){ 10 if($item['userScore']>=$rv['startScore'] && $item['userScore']<$rv['endScore']){ 11 $item['userRank'] = $rv['rankName']; 12 } 13 } 14 return $item; 15 }); 16 return $rs; 17 } 18 ?>