當我們做一些網站項目的時候,都會遇到這樣一類問題,刪除一個欄目,而這個欄目又不是最底層欄目,也就是說,被刪除的欄目擁有子欄目,這時,我們執行刪除該欄目的命令,就需要將該欄位及其子欄目一併刪除,因為我們不可能讓一個類別的上級欄位被刪除後,子欄位也顯示或存在資料庫中,這時候,欄位刪除的問題就來了。
先上圖:
這是一個簡單的權限管理的頁面,圖中管理員權限為頂層權限,欄位管理為管理員權限的子權限,欄位新增又為欄位管理的子權限,這樣一個三級分類,我們想要達到的效果為:刪除管理員權限,其下方欄位管理、欄位新增權限全被同時刪除;刪除欄位管理權限,則欄位新增也同時被刪除;刪除欄位新增權限則只刪除其本身。
接下來實作方法:
1.是控制器中簡單刪除方法:
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出來時,結果為:
也就是說,如果我們想要取到這條信息的id值,只需要獲取$options['where']['id']即可,但是注意,如果數組中的where同樣是一個數組的時候,這就意味著我們進行的是批量刪除,這也是單個刪除和批次刪除的差異所在,關於批次刪除,之後我會再寫一篇來簡單介紹,這次我們只寫單一刪除。
首先,寫一個取得所有資料的方法childid,這裡的$priid就是我們傳進去的所要刪除的那一欄的id
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數組中,返回。
最後在建構函式中呼叫
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語句進行資料刪除。
以上就是單一欄位刪除的全部內容。
以上是刪除一個欄位該如何做?的詳細內容。更多資訊請關注PHP中文網其他相關文章!