paginate()出来的数据怎样循环插入数据?

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 ?>

 

posted @ 2019-03-13 15:38  原来是个帅小伙  阅读(242)  评论(0编辑  收藏  举报