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 就这样删除也就完成了