ThinkPHP6.0 模型
ThinkPHP6 模型
#請確保你已經在資料庫設定檔中設定了資料庫連線資訊
模型會自動對應資料表,模型類別的命名規則是除去表前綴的資料表名稱,採用駝峰法命名,並且首字母大寫
模型自動對應的資料表名稱都是遵循小寫下劃線規範,如果你的表名有大寫的情況,必須透過設定模型的table屬性。
一、建立模型
模型名稱 | 資料庫前綴 | ||
#Cat | shop_cat | ||
shop_goods | |||
shop_user_order |
屬性 | 描述 |
#name | 模型名稱(相當於不含資料表前後綴的表名,預設為目前模型類別名稱) |
table | #資料表名(預設為自動取得) |
pk | 主鍵名(預設為id ) |
#schema | 模型對應資料表欄位及型別 |
1、name和table
當你的資料表沒有前綴的時候,name和table屬性的定義是沒有區別的,定義任何一個即可
## }}class Goods extends Model{
protected $name = 'Goods';
protected $table = 'shop_goods';
public function select(){
$select = Goods::select();
return $select->toArray();
}
}
2 、pk 改變主鍵名稱model 預設的主鍵是idpublic 函數 find($id=1){// 可以把主鍵改為shop_id 試試
ALTER TABLE `ouyangke`.`shop_goods `
CHANGE COLUMN `id` `shop_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 商品ID' FIRST,
DROP PRIMARY KEY,
##ADD PRIMARY KEY (DROP PRIMARY KEY,
##ADD PRIMARY KEY (DROPY `shop_id`) USING BTREE;
class Goods extends Model{
protected $name = 'Goods';
protected $table = 'shop_goods';
# protected $table = 'shop_goods';
protected $pk = 'shop_id';
$find = Goods::find($id);
- }#}
3、
schema 設定模型對應資料表欄位及類型- 預設會自動取得(包括欄位類型),但自動取得會導致增加一次查詢
schema 屬性一旦定義,就必須定義完整的資料表欄位類型類型根據php資料型別定義,如果是json型別直接定義為json即可4、class Goods extends Model{
protected $name = 'Goods';
protected $table = 'shop_goods';
protected $pk = 'shop_id';
protected $schema = [
## 'shop_id' => 'int',## 'shop_id' => 'int',## 'cat' => 'int',## 'cat' => 'int',
## > 'string', 'price' => 'float', 'discount' => 'int', … 'discount' => 'int', & 'gt; 'int', 'status' => 'int', 'add_time' => 'int' ];#### 對某個欄位定義需要自動轉換的類型,可以使用type屬性##### protected $type = [###### 'shop_id' => 'int'###### ];# ##### public function select(){###### $select = Goods::select();###return $select->toArray();
}
##}
disuse 資料表廢棄欄位(陣列)
class Goods extends Model{ protected $name = 'Goods'; protected $table = 'shop_goods';protected $pk = 'shop_id';
protected $disuse = [
'discount',
# 'stock'
### 'stock'
## ## public function select(){# $select = Goods::select();#卷
}5、其他屬性(不常用)
#更新時間戳欄位###########deleteTime ####### #用於定義你的軟刪除標記欄位############defaultSoftDelete #######定義軟體刪除欄位的預設值############
屬性 描述 #suffix 資料表後綴(預設為空) connection 資料庫連線(預設讀取資料庫設定) query 模型所使用的查詢類別名稱 field 模型允許寫入的欄位清單(陣列) strict 是否嚴格區分欄位大小寫(預設為true ) readonly 欄位唯讀 json 設定欄位為JSON資料 jsonType ##jsonAssoc設定JSON欄位的型別 autoWriteTimestamp #設定JSON資料回傳數組 createTime #自動寫入建立和更新的時間戳記欄位(預設為關閉) updateTime 建立時間戳欄位 四、模型主要功能
1、獲取器
獲取器的作用是對模型實例的(原始)資料做出自動處理
#命名規則:
get 欄位名稱Attr
#欄位名稱是資料表欄位的駝峰轉換
命名規則:class Goods extends Model{
public function index(){
$find = Goods::find(10);##o ## # echo $ find->status;
return $find->toArray();
}
# public f status = [
1=>'開啟',
2=>'關閉'
# ]; }}2、修改器
修改器的主要功能是對模型進行設定的資料物件值進行處理
set 欄位名稱 Attr
- $create = Goods::create([
class Goods extends Model {
public function index(){
' => '新商品', 'price' => '59.99',#class Goods extends Model{## return $create;
}
public function setCatAttr($v,$all){
// $ $ $ $ $. # return (int)$v;
}
}
3、搜尋器#搜尋器的作用是用於封裝字段(或者搜索標識)的查詢條件表達式命名規則:search 字段名Attr
## public function index(){
$select = Goods::withSearch(['title'],[
return $select->toArray();# return $select->toArray();####### }## } ### public function searchTitleAttr($query,$v){###### $query->where('title','like', $v . '%');##### }# }# }# }# }# ######}#########4、檢查資料###### 'title' => '新'
])->select();
如果要判斷資料集是否為空,不能直接使用
empty
判斷必須使用資料集物件的
isEmpty
方法判斷use think\Model;#use think\facade\Db;class Goods extends Model{class Goods extends Model{
public function index(){
$select = Goods:: $select = Goods:: $select
# where('title','1')->select(); if(empty($select)){ echo 111;##卷# if($select->isEmpty()){
echo 111;
# }
##五、右側列表改為model範例model程式碼namespace app\model;
protected $name = 'Goods';
protected $table = 'shop_goods';
public function get_all($where,$order='add_time DESC',$p=1,$total=10){
## $count = Goods::where($where)-> ;count(); $list = Goods::where($where) ¢ , $total) ->select(); if($list-) } $data = $list->toArray(); foreach($data as &$data_v){ as &$data_v){ as &$data_v){ :table('shop_cat')->where('id',$data_v['cat'])->value('name'); } $arr = [ 'count' => ceil($count/$total), 'data' =#gt; return $arr; } public function getStatusAttr($v){ $status = [## 開啟開啟」開啟 1
## 2=>'關閉' ];## return $status[$v];
## return $status[$v];#o ($v){
return date('Y-m-d',$v);
}
#}
controller程式碼public function index(){
## $title = '商城'; $login = '歐陽克'; # 左側選單 $menu = Db::table('shop_menu')->where('fid',0)->select(); $left = []; # foreach($menu as $menu_k=>$menu_v){ $left[$menu_k] = $menu_v; 對 $left[list :table('shop_menu')->where('fid',$menu_v['id'])->select(); }# # 右邊清單 $param = Request::param(); if(isset($param['status']) && $param['status'] == 1){ $where ['status'] = 1; }else if(isset($param['status']) && $param['status'] == 2){$where[ 'status'] = 2; }else{ $where = true;
## }
$p = isset ($param['p ']) ? $param['p'] : 1;
# $db = new Goods();$order = [
' add_time DESC',
'id DESC'
];
$right = $db->get_all($where,$order,$p,5);
View::assign([
'title' => $title,
'login' => $login,
## 'login' => $login,## > $left,
'right' => $right['data'],
'count' => $right['count'],
'p 'p ' => $p,
'status' => isset($param['status']) ? $param['status'] : 0
]);
return View::fetch();
}
##html程式碼{$ right_v.status}< /td> <td>{$right_v.add_time}</td>
六、模型事件#模型事件是指在進行模型的查詢和寫入操作的時候觸發的操作行為
- #模型事件只在呼叫模型的方法生效,使用查詢建構器操作是無效的
編號 事件 #描述 事件方法名稱 after_read #1 #before_insert 查詢後 onAfterRead 2 after_insert #新增前 onBeforeInsert 3 before_update 新增後 onAfterInsert 4 #after_update #onBeforeUpdate 5 before_write 更新後 onAfterUpdate 6 ###after_write ######寫入後######onAfterWrite###### 寫入前 ##寫入前onBeforeWrite 7 8 before_delete 刪除前 onBeforeDelete 9 after_delete 刪除後 onAfterDelete 10 #before_restore 恢復前 onBeforeRestore 11 after_restore #onAfterRestore namespace app\model; use think\Model; class Goods extends Model{ public function one_update(){ $update = Goods::update( ['price'=>'99.99'], ['id'=>22] ); return $update; } # 执行更新操作,就会之下onBeforeUpdate方法 public static function onBeforeUpdate($goods){ print_r($goods->price); return true; } }