ThinkPHP 提供了一個 Model 類,供其他的 Model 進行繼承。Model 類中是 MVC 中的模型類,它是調用 持久層 的上層類。感覺這麼描述問題很多,但是有什麼辦法呢?但是,這個 Model 有時無法滿足我們的一些需求,因此我們需要自定義一個 Model 類出來,不過自定義的 Mo ...
ThinkPHP 提供了一個 Model 類,供其他的 Model 進行繼承。Model 類中是 MVC 中的模型類,它是調用 持久層 的上層類。感覺這麼描述問題很多,但是有什麼辦法呢?但是,這個 Model 有時無法滿足我們的一些需求,因此我們需要自定義一個 Model 類出來,不過自定義的 Model 同樣要繼承 TP 提供的 Model 類,而把我們自定義的 Model 類作為我們項目中的 Model 基類。我怎麼感覺我在說繞口令,等等...我有點暈。
無聊的需求
在使用 Java 的開源項目 JeeSite 時,養成了一個不好的習慣,習慣給每張表都增加 create_by、create_date、update_by、update_date、remarks 和 del_flag 這麼幾個欄位。如果每張表都有這幾個欄位,那麼對每張表進行 insert 時都會對以上的欄位進行設置,對每張表進行 update 時都會對其中部分欄位進行更新,對每條記錄進行 delete 時都其實是對 del_flag 欄位進行 置位。重覆操作很多,一些操作方法被修改。那麼,這個時候就要自定義一個自己的 Model 來作為項目的 基類 了,這個 Model 就負責幹上面我說的那些事情了。
自定義一個 Model
自定義一個 Model,Model 中至少重新 TP 提供的 Model 中的 add、save、delete 和 select 方法。
定義代碼如下:
1 <?php 2 namespace Admin\Model; 3 use Think\Model; 4 5 /** 6 * 項目中其他 Model 類的基類 7 * 該類繼承自 TP 提供的基類 Model 8 */ 9 class BaseModel extends Model { 10 11 /** 12 * 繼承基類 Model 的 add 方法 13 * 自動插入 id create_by create_date update_by update_date del_flag 14 */ 15 public function add($data='',$options=array(),$replace=false) { 16 17 $data["id"] = $this->getUuid(); 18 $data["create_by"] = ""; 19 $data["create_date"] = date("Y-m-d H:i:s"); 20 $data["update_by"] = ""; 21 $data["update_date"] = date("Y-m-d H:i:s"); 22 $data["del_flag"] = '0'; 23 24 return parent::add($data, $options, $replace); 25 } 26 27 /** 28 * 獲得 未刪除 的所有數據 29 * 記錄是否被刪除通過 del_flag 欄位來進行確定 30 */ 31 public function select($options=array()) { 32 $map["del_flag"] = 0; 33 $this->where($map); 34 35 return parent::select($options); 36 } 37 38 /** 39 * 獲取 全部 的所有數據 40 */ 41 public function selectAll($options=array()) { 42 return parent::select($options); 43 } 44 45 /** 46 * 更新數據 47 * 更新數據時,要更新 update_by update_date 兩個欄位 48 */ 49 public function save($data='',$options=array()) { 50 $data["update_by"] = ""; 51 $data["update_date"] = date("Y-m-d H:i:s"); 52 53 return parent::save($data, $options); 54 } 55 56 /** 57 * 刪除也是更新 58 * 設置 刪除 標誌位即可 59 */ 60 public function delete($data='',$options=array()) { 61 $data["del_flag"] = 1; 62 63 return parent::save($data, $options); 64 }
這樣,我們的 BaseModel 就定義好了,以後項目中的 Model 就不再繼承 TP 的 Model 類了,而是繼承我們自定義的 BaseModel 了。
繼承我們定義的基類
繼承的 BaseModel 的方法和繼承 Model 的方法是一樣的,只是使用 use 引入命名空間到當前作用域時的需要修改為我們的命名空間,而不是再去使用 TP 提供的命名空間。代碼如下:
1 <?php 2 namespace Admin\Model; 3 use Admin\Model\BaseModel; 4 5 class TrunkModel extends BaseModel {
use 引入的命名空間是 Admin\Model\BaseModel ,因為我們定義的 BaseModel 的命名空間是 Admin\Model,因為這裡的 TrunkModel 和 BaseModel 在一個命名空間下,省去 use 也是可以的。
這樣,在我們用 D 方法實例化 TrunkModel 的對象後,使用 add 方法插入數據時,就會先調用 BaseModel 中的 add 方法了,這樣我們每張表都有的 create_by 等一系列欄位就都會自動得到了。