首頁  >  文章  >  後端開發  >  刪除一個欄位該如何做?

刪除一個欄位該如何做?

PHP中文网
PHP中文网原創
2017-06-20 11:01:431903瀏覽

  當我們做一些網站項目的時候,都會遇到這樣一類問題,刪除一個欄目,而這個欄目又不是最底層欄目,也就是說,被刪除的欄目擁有子欄目,這時,我們執行刪除該欄目的命令,就需要將該欄位及其子欄目一併刪除,因為我們不可能讓一個類別的上級欄位被刪除後,子欄位也顯示或存在資料庫中,這時候,欄位刪除的問題就來了。

先上圖:

  這是一個簡單的權限管理的頁面,圖中管理員權限為頂層權限,欄位管理為管理員權限的子權限,欄位新增又為欄位管理的子權限,這樣一個三級分類,我們想要達到的效果為:刪除管理員權限,其下方欄位管理、欄位新增權限全被同時刪除;刪除欄位管理權限,則欄位新增也同時被刪除;刪除欄位新增權限則只刪除其本身。

 

接下來實作方法:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn