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

来源:互联网 发布:java中标签的作用 编辑:程序博客网 时间:2024/06/03 05:30

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.csdn.net/helin916012530/article/details/39338699就这样删除也就完成了

0 0