Thinkphp3.2 无限级分类删除,单个删除,批量删除

本文介绍了一种在权限管理系统中实现递归删除的方法。通过使用递归函数 childid 和 getchildid,可以确保在删除某个权限节点时,其所有子节点也会被一并删除。此外,还详细解释了 _before_delete 函数的作用及其执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,单个删除

这时控制器的单个删除方法

    public function del(){
      $id=I('id');
      $pri=D('privilege');
      // dump($id);
      // die;
      if($pri->delete($id)){
        $this->success('删除权限成功',U('lst'));
      }else{
        $this->error('删除权限失败',U('lst'));
      }
    }

首先我们想一下,比如a的子类是b,b的子类是c,c的子类是d,那么我们点击一个b的按钮,按道理,cd都要被删除,但是如果只有上面一个函数那么界面里面确实吧,bcd都被删除了,但是数据库里面只有b被删除了,还保留cd,所以这是我们需要另外的方法,_before_delete函数,这个在model层面

public function childid($priid){
        $data = $this->select();
        // dump($data);
        // die;
        return $this->getchildid($data,$priid);
    }

    public function getchildid($data,$parentid){
      static $ret=array();
      foreach($data as $k =>$v){
        if($v['parentid']==$parentid){
          $ret[]=$v['id'];
          $this->getchildid($data,$v['id']);
        }
      }
      return $ret;
    }

    public function _before_delete($options){
        if(is_array($options['where']['id'])){    //if where下面的id是数组的话那么执行的是批量删除,否则是单个删除
              // var_dump($options['where']['id'][1]);
              // die;
            $arr=explode(',', $options['where']['id'][1]);      //把字符串变成数组
          //  var_dump($arr);
          //  die;
            $soncates=array();
            foreach ($arr as $k => $v)
            {
                $soncates2=$this->childid($v);
                // var_dump($soncates2);
                // die;
                $soncates=array_merge($soncates,$soncates2);            //合并数组
            }
            $soncates=array_unique($soncates);        //移除数组中相同的部分
            $childrenids=implode(',', $soncates);
            // var_dump($childrenids);
            // die;
        } else {
            $childrenids = $this->childid($options['where']['id']);
            $childrenids = implode(',',$childrenids);
            // dump($childrenids);
            // die;
        }
        if($childrenids){
            $this->execute("delete from cs_privilege where id in($childrenids)");
        }
    }
childid和getchildid这两个函数是什么意思是呢,childid是获取被删除的id,getchildid是找出这个id下面的子栏目,也是递归寻找

下面来解释一下_before_delete这个函数,虽然我也有点不理解,这个是在删除之前执行的操作

如果你是单个删除的话打印出来$options,是下图这个样子,id下面是单个数据

如果你是批量删除的话打印出来$options,是下图这个样子,id下面是个数组

这样我们就能理解到底是批量删除还是单个删除了,

if else就能看懂了,implode,是拆分数组,explode是合并数组

$this->execute("delete from cs_privilege where id in($childrenids)");这个是sql语句,我也不是很懂,
详情请看http://blog.youkuaiyun.com/helin916012530/article/details/39338699
就这样删除也就完成了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值