當咱們作一些網站項目的時候,都會遇到這樣一類問題,刪除一個欄目,而這個欄目又不是最底層欄目,也就是說,被刪除的欄目擁有子欄目,這時,咱們執行刪除該欄目的命令,就須要將該欄目及其子欄目一併刪除,由於咱們不可能讓一個類的上級欄目被刪除後,子欄目還顯示或存在數據庫中,這時候,欄目刪除的問題就來了。數據庫
先上圖:數組
這是一個簡單的權限管理的頁面,圖中管理員權限爲頂級權限,欄目管理爲管理員權限的子權限,欄目添加又爲欄目管理的子權限,這樣一個三級分類,咱們想要達到的效果爲:刪除管理員權限,其下欄目管理、欄目添加權限全被同時刪除;刪除欄目管理權限,則欄目添加也同時被刪除;刪除欄目添加權限則只刪除其自己。函數
接下來實現方法:網站
1.是控制器中簡單刪除方法:this
1 public function privilege_del(){ 2 $pri = D('privilege'); 3 $id = I('id'); 4 if($pri->delete($id)){ 5 $this->success('刪除權限成功!',U('Privilege/privilege_lst')); 6 }else{ 7 $this->error('刪除權限失敗!'); 8 } 9 }
2.咱們思考,咱們想要的同時刪除的結果,實際上是當咱們選擇上級欄目刪除時,代碼首先幫咱們刪除該欄目類別的最底層的子欄目,而後依次向上刪除,最終刪除咱們選擇的上級欄目,因此咱們須要寫一個前置的構造函數進行操做 _before_delete($options) 這是ThinkPHP提供給咱們的函數,他的用法是在咱們執行刪除方法前,執行這個函數,其中$options爲咱們要刪除的信息,具體爲一個二維數組,當咱們把$options dump出來時,結果爲: spa
也就是說,若是咱們想要取到這條信息的id值,只須要獲取$options['where']['id']便可,可是注意,若是數組中的where一樣是一個數組的時候,這就意味着咱們進行的是批量刪除,這也是單個刪除和批量刪除的區別所在,關於批量刪除,以後我會再寫一篇來簡單介紹,此次咱們只寫單個刪除。code
首先,寫一個獲取全部數據的方法childid,這裏的$priid就是咱們傳進去的所要刪除的那一欄的idblog
1 public function childid($priid){ 2 $data = $this->select(); 3 return $this->getchildid($data,$priid); 4 }
而後根據全部數據查找咱們要刪除的欄目的下面的子欄目的id,再次建立一個方法 getchildid獲取全部須要刪除的id遞歸
1 public function getchildid($data,$parentid){ 2 static $ret=array(); 3 foreach ($data as $k => $v) { 4 if($v['parentid']==$parentid){ 5 $ret[]=$v['id']; 6 $this->getchildid($data,$v['id']); 7 } 8 } 9 return $ret; 10 }
這裏又用到了遞歸,在全部數據中查詢完下級欄目後,查詢下級欄目的下級欄目,最後將該欄目的全部子欄目的id版存到ret數組中,返回。get
最後在構造函數中調用
1 public function _before_delete($options){ 2 //單個刪除 3 $chilrenids =$this->childid($options['where']['id']); 4 $chilrenids = implode(',', $chilrenids); 5 if($chilrenids){ 6 $this->execute("delete from ed_privilege where id in($chilrenids)"); 7 } 8 }
將獲取的id號用逗號隔開,由於此時不能再使用delete方法去刪除數據,若使用則將再次調用構造函數成爲死循環,因此咱們須要在這裏執行SQL語句進行數據刪除。
以上就是單個欄目刪除的所有內容。