ThinkPHP6.0 模型



ThinkPHP6 模型

  • #請確保你已經在資料庫設定檔中設定了資料庫連線資訊

  • 模型會自動對應資料表,模型類別的命名規則是除去表前綴的資料表名稱,採用駝峰法命名,並且首字母大寫

  • 模型自動對應的資料表名稱都是遵循小寫下劃線規範,如果你的表名有大寫的情況,必須透過設定模型的table屬性。

一、建立模型

##Goods shop_goods##UserOrder 

表格前綴設定:config/database.php 檔案裡prefix

  • 第一步:建立一個跟控制器平級的目錄,目錄名稱:model

  • 第二步:在model 建立Goods.php 檔案

二、模型操作

在模型中除了可以呼叫資料庫類別的方法之外(換句話說,資料庫的所有查詢建構器方法模型中都可以支援) ,可以定義自己的方法,所以也可以把模型看成是資料庫的增強版

  • #模型檔案裡的自訂方法,不要和thinkphp 方法一樣名稱

  • 模型裡的 Goods:: 也可以用static:: 關鍵字

  • 鍊式操作,都可以在模型裡使用

1、find查詢數據

find 來取得單一數據,傳回的是目前模型的物件實例

namespace app\model;

use think\Model;

class Goods extends Model{

    public function find(){

#        $find = Goods::find(6);

        $find = Goods::where('id',7)->find();

##  #    

##    }

}

2、
controller

怎麼呼叫model

namespace app\controller;

use app\model\Goods;

class Index{

    public function index(){

#        $db = new Goods( );

        $index = $db->find();

        print_r($index);

    }

}

find(6) 查詢失敗,是因為資料庫主鍵名稱不是id

3、

select

查詢資料select 取得多條數據,傳回的是目前模型的物件實例

public function select(){

    $select = Goods::select();

    $select = Goods::select (6);

    $select = Goods::where('id','>',7)->select();

    return $select;

}

4、資料轉換

toArray

#方法將目前的模型實例輸出為陣列

public function select (){

    $select = Goods::select();

    $select = Goods::select(6);

    $select = Goods::where( 'id','>',7)->select();

    return $select->toArray();

}

# 5.增加數據

  • create

    靜態方法新增數據,傳回的是目前模型的物件實例

  • # #public function create(){
    $create = Goods::create([

        'cat' =>  3,

        'title' =>  '新商品',

        'price' =>  '59.99',

      'price' =>  '59.99',

        '59.99',

        '59.99',

   #    ]);

    echo $create->id;  // 可直接取得自增id

##    return $create;

}

##    return $create;

    }
  • 新增資料的最佳實務原則:使用create方法新增數據,使用saveAll批次新增資料。

    6、修改資料
  • update

    靜態方法修改數據,傳回的是目前模型的物件實例

save

在取出資料後,更改欄位更新資料。這種方式是最佳的更新方式

namespace app\model;

use think\Model;

class Goods extends Model {

    public function update(){

        # 更新方式1

        $update = Goods::update(

##      $update = Goods::update(

##       '99.99'],

            ['id'=>22]

        );

   

#        $user = Goods::find(23);

        $user->price     = '102.99';## #v);

        return $save;

    }

}

    7、刪除資料
  • #delete
  • 靜態方法刪除數據,傳回的是目前模型的物件實例
  • #destroy
  • 根據主鍵刪除

public function delete(){

##    # 刪除方法1

    $delete = Goods::where('id',3)->delete();

    # 刪除方法2

##    $delete = User::destroy(4);

    return $delete;

}

TP模型如果只能增刪查改,不如在Controller 執行了。 TP模型很多特點,下面為大家一一介紹

三、模型設定

為了和資料庫更好的適配,模型可以提前設定對應的資料庫屬性,一個檔案配置一個數據表

模型名稱資料庫前綴
#Catshop_cat
shop_user_order
屬性描述
#name 模型名稱(相當於不含資料表前後綴的表名,預設為目前模型類別名稱)
table #資料表名(預設為自動取得)
pk 主鍵名(預設為id )
#schema 模型對應資料表欄位及型別
################################# ##type ######模型需要自動轉換的欄位及類型############disuse ######資料表廢棄欄位(陣列)######## #####

 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 預設的主鍵是id

// 可以把主鍵改為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';

    public 函數 find($id=1){

        $find = Goods::find($id);

return $find->toArray();
  •     }

    #}
  • 3、

    schema
  • 設定模型對應資料表欄位及類型
  • 預設會自動取得(包括欄位類型),但自動取得會導致增加一次查詢

schema 屬性一旦定義,就必須定義完整的資料表欄位類型

類型根據php資料型別定義,如果是json型別直接定義為json即可

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();

    }

##}

4、

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、其他屬性(不常用)

設定欄位為JSON資料jsonType 設定JSON欄位的型別##jsonAssoc autoWriteTimestamp createTime updateTime 
屬性描述
#suffix 資料表後綴(預設為空)
connection 資料庫連線(預設讀取資料庫設定)
query 模型所使用的查詢類別名稱
field 模型允許寫入的欄位清單(陣列)
strict 是否嚴格區分欄位大小寫(預設為true )
readonly 欄位唯讀
json 
#設定JSON資料回傳數組
#自動寫入建立和更新的時間戳記欄位(預設為關閉)
建立時間戳欄位
#更新時間戳欄位###########deleteTime ####### #用於定義你的軟刪除標記欄位############defaultSoftDelete #######定義軟體刪除欄位的預設值############

四、模型主要功能

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
  • class Goods extends Model {    public function index(){

  •         $create = Goods::create([
            ' =>  '新商品',

            'price' =>  '59.99',

#         

##        return $create;

    }

    public function setCatAttr($v,$all){

        // $ $ $ $ $. #        return (int)$v;

    }

}

3、搜尋器

#搜尋器的作用是用於封裝字段(或者搜索標識)的查詢條件表達式

命名規則:

search 字段名Attr

class Goods extends Model{
    ##    public function index(){
  •         $select = Goods::withSearch(['title'],[

## 'title' => '新'

        ])->select();

        return $select->toArray();

#    return $select->toArray();#######    }##  } ###    public function searchTitleAttr($query,$v){######        $query->where('title','like', $v . '%');#####    }#    }#    }#    }#    }# ######}#########4、檢查資料####
  • 如果要判斷資料集是否為空,不能直接使用empty 判斷

  • 必須使用資料集物件的 isEmpty 方法判斷

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;

use think\Model;

#use think\facade\Db;

class Goods extends 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#before_insert after_insert before_update #after_update before_write ##寫入前onBeforeWrite7 ###after_write ######寫入後######onAfterWrite######
編號事件#描述事件方法名稱
#1
查詢後 onAfterRead
#新增前onBeforeInsert
新增後onAfterInsert4
#onBeforeUpdate
更新後onAfterUpdate
寫入前
before_delete 刪除前onBeforeDelete
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;
    }
}