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

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

1、在修改和新增栏目成功的时候生成缓存文件,在模板中使用缓存
/*更新缓存文件*/
$map['topid'] = 0;
$map['yiyuanid'] = $this->_get('yiyuanid');
$other['order'] = 'sort desc,keshi.id asc';
$other['field'] = 'keshi.*,yiyuan.name as yiyuan';
$other['join'] = 'yiyuan on yiyuan.id=keshi.yiyuanid';
$digui = digui('keshi',$map,$other);
S('keshi',$digui);//缓存数据
2、核心的三个递归函数
/*
* 递归数据,递归成多维数组,childs存储下级,生产环境中请把返回值进行缓存,这样只查库一次,可以在新增和更新的方法处再调用这个函数更新缓存
* @param string $table 查询的表名
* @param array $where 查询的where条件
* @param array $other 其它查询需要的变量
* @return array $list 一个表示层级关系的多维数组
*/
function digui($table,$where,$other){
    $Form = M($table);
    if($other['join']){
        $list = $Form->field($other['field'])->join($other['join'])->where($where)->order($other['order'])->select();
    }else{
        $list = $Form->field($other['field'])->where($where)->order($other['order'])->select();
    }
    foreach ($list as $k => $v) {
        if($digui = digui($table,array('topid'=>$v['id']),$other)){
            $list[$k]['childs'] = $digui;//递归子类
        }        
    }
    return $list;
}
    
/*
* 读取递归数据的函数,使用前请把digui()函数的返回值进行缓存
* @param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组,是由digui()产生的
* @return void 无返回值直接输出
*/
function KeshiType($list){
    foreach ($list as $k => $v) {
         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>';
         KeshiTypeSeed($v['childs']);
     } 
}
/*
* 楼上KeshiType的子函数配合递归
*/   
function KeshiTypeSeed($list){
    if($list){
        echo '<tr align="center"  bgcolor="#FFFFFF" height="22" class="seed"><td colspan="4"><table width="98%">';
        foreach ($list as $k => $v) {
             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>';
             KeshiTypeSeed($v['childs']);
         }
        echo '</table></td></tr>';
    }
}
3、在模板中使用缓存进行递归栏目
/我增加了点击展开关闭栏目的jquery代码,
<script>
    /*
    * 点击展开子类
    *
    */
    $(".jia").click(function(){
        if($(this).parent("td").parent("tr").next(".seed").is(":hidden")){
            $(this).parent("td").parent("tr").next(".seed").show();
            $(this).html("-");
        }else{
            $(this).parent("td").parent("tr").next(".seed").hide();
            $(this).html("+");  
        }
          
    });
      
    $(".seed").prev(".fid").find("td").find("span.jia").html("-");
      
    /*
    * 点击关闭所有子类
    *
    */
    $("#closeseed").click(function(){
        if($(this).val() == "展开所有子类"){
            $(".seed").show();
            $(this).val("关闭所有子类");
            $.each($(".jia"),function(k,v){
                if($(this).html()){
                    $(this).html("-");
                }
            });                     
        }else{
            $(".seed").hide();
            $(this).val("展开所有子类");
            $.each($(".jia"),function(k,v){
                if($(this).html()){
                    $(this).html("+");
                }
            });     
        }       
    });
      
});
</script>
//模板递归的部分 
<php>
    $keshis = S('keshi');//读取缓存
    KeshiType($keshis);//递归输出数据
 </php>