ThinkPHP使用缓存解决递归问题,只查库一次

jerry thinkphp 2015年11月18日 收藏
基本思路是先用递归把栏目整成多维数组,并缓存之。多维数组表示一级一级的,然后输出的时候再用递归把多维数组循环输出出来,另外我写了JQUERY代码,可以展开关闭子分类
前天哥哥写了个递归,发现查库次数太多,所以修改了一下,现在只查库一次了,有问题的发我邮箱交流 576272452@qq.com,没代码没真相,下面上代码

1、在修改和新增栏目成功的时候生成缓存文件,在模板中使用缓存
  1. /*更新缓存文件*/
  2. $map['topid'] = 0;
  3. $map['yiyuanid'] = $this->_get('yiyuanid');
  4. $other['order'] = 'sort desc,keshi.id asc';
  5. $other['field'] = 'keshi.*,yiyuan.name as yiyuan';
  6. $other['join'] = 'yiyuan on yiyuan.id=keshi.yiyuanid';
  7. $digui = digui('keshi',$map,$other);
  8. S('keshi',$digui);//缓存数据
2、核心的三个递归函数
  1. /*
  2. * 递归数据,递归成多维数组,childs存储下级,生产环境中请把返回值进行缓存,这样只查库一次,可以在新增和更新的方法处再调用这个函数更新缓存
  3. * @param string $table 查询的表名
  4. * @param array $where 查询的where条件
  5. * @param array $other 其它查询需要的变量
  6. * @return array $list 一个表示层级关系的多维数组
  7. */
  8. function digui($table,$where,$other){
  9.     $Form = M($table);
  10.     if($other['join']){
  11.         $list = $Form->field($other['field'])->join($other['join'])->where($where)->order($other['order'])->select();
  12.     }else{
  13.         $list = $Form->field($other['field'])->where($where)->order($other['order'])->select();
  14.     }
  15.     foreach ($list as $k => $v) {
  16.         if($digui = digui($table,array('topid'=>$v['id']),$other)){
  17.             $list[$k]['childs'] = $digui;//递归子类
  18.         }        
  19.     }
  20.     return $list;
  21. }
  22.     
  23. /*
  24. * 读取递归数据的函数,使用前请把digui()函数的返回值进行缓存
  25. * @param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组,是由digui()产生的
  26. * @return void 无返回值直接输出
  27. */
  28. function KeshiType($list){
  29.     foreach ($list as $k => $v) {
  30.          echo '<tr align="center"  bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'.$v['id'].'</td><td width="14%">'.$v['yiyuan'].'</td><td width="14%">'.$v['name'].'</td><td><span class="coolbg" onClick="winopen(\'/Code/keshi_edit/yiyuanid/'.$v['yiyuanid'].'/id/'.$v['id'].'\',\'id'.$v['id'].'\',1000,650)">编辑</span>  <span alt="'.$v['id'].'" title="'.$v['name'].'" class="ksjb">编辑</span>  <a href="/Yisheng/index/yiyuanid/'.$v['yiyuanid'].'/keshiid/'.$v['id'].'" class="coolbg">编辑</a>  <a href="/Code/keshi_del/yiyuanid/'.$v['yiyuanid'].'/id/'.$v['id'].'" class="coolbg">删除</a></td></tr>';
  31.          KeshiTypeSeed($v['childs']);
  32.      } 
  33. }
  34. /*
  35. * 楼上KeshiType的子函数配合递归
  36. */   
  37. function KeshiTypeSeed($list){
  38.     if($list){
  39.         echo '<tr align="center"  bgcolor="#FFFFFF" height="22" class="seed"><td colspan="4"><table width="98%">';
  40.         foreach ($list as $k => $v) {
  41.              echo '<tr align="center"  bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'.$v['id'].'</td><td width="14%">'.$v['yiyuan'].'</td><td width="14%">'.$v['name'].'</td><td><span class="coolbg" onClick="winopen(\'/Code/keshi_edit/yiyuanid/'.$v['yiyuanid'].'/id/'.$v['id'].'\',\'id'.$v['id'].'\',1000,650)">编辑</span>  <span alt="'.$v['id'].'" title="'.$v['name'].'" class="ksjb">管理2</span>  <a href="/Yisheng/index/yiyuanid/'.$v['yiyuanid'].'/keshiid/'.$v['id'].'" class="coolbg">管理</a>  <a href="/Code/keshi_del/yiyuanid/'.$v['yiyuanid'].'/id/'.$v['id'].'" class="coolbg">删除</a></td></tr>';
  42.              KeshiTypeSeed($v['childs']);
  43.          }
  44.         echo '</table></td></tr>';
  45.     }
  46. }
3、在模板中使用缓存进行递归栏目
  1. /我增加了点击展开关闭栏目的jquery代码,
  2. <script>
  3.     /*
  4.     * 点击展开子类
  5.     *
  6.     */
  7.     $(".jia").click(function(){
  8.         if($(this).parent("td").parent("tr").next(".seed").is(":hidden")){
  9.             $(this).parent("td").parent("tr").next(".seed").show();
  10.             $(this).html("-");
  11.         }else{
  12.             $(this).parent("td").parent("tr").next(".seed").hide();
  13.             $(this).html("+");  
  14.         }
  15.           
  16.     });
  17.       
  18.     $(".seed").prev(".fid").find("td").find("span.jia").html("-");
  19.       
  20.     /*
  21.     * 点击关闭所有子类
  22.     *
  23.     */
  24.     $("#closeseed").click(function(){
  25.         if($(this).val() == "展开所有子类"){
  26.             $(".seed").show();
  27.             $(this).val("关闭所有子类");
  28.             $.each($(".jia"),function(k,v){
  29.                 if($(this).html()){
  30.                     $(this).html("-");
  31.                 }
  32.             });                     
  33.         }else{
  34.             $(".seed").hide();
  35.             $(this).val("展开所有子类");
  36.             $.each($(".jia"),function(k,v){
  37.                 if($(this).html()){
  38.                     $(this).html("+");
  39.                 }
  40.             });     
  41.         }       
  42.     });
  43.       
  44. });
  45. </script>
  46. //模板递归的部分 
  47. <php>
  48.     $keshis = S('keshi');//读取缓存
  49.     KeshiType($keshis);//递归输出数据
  50.  </php>