TP筆記4、模型

1 模型

1.1 模型創建規則

  1. 存儲地址:/應用/模塊/Model目錄中
  2. 命名規則:模型名稱+Model+.class.php
  • 模型名稱應與對應表名一致

1.2 實例化模型對象

1.2.1 常用實例化
  • dump()是TP一個內置函數。與PHP的var_dump()差不多
public function test1(){
        $model=new \Admin\Model\GoodsModel();.//要使用命名空間
        dump($model);
    }

在這裏插入圖片描述

1.2.2 TP內置M函數實例化對象
  • M函數默認3個參數。第一個指某個數據表,第二個指表前綴,第三個指mysql連接信息
public function test2(){
        $model=M('goods');//參數指定具體數據表
        dump($model);
    }

在這裏插入圖片描述

1.2.3 D函數實例化
  • D函數可以跨模塊使用
  • 當實例化某個不存在的自定義模型,會使用TP的模型基類進行實例化
public function test3(){
        $model=D('goods');
        dump($model);
    }
1.2.4 M與D的區別
  1. M用於實例化TP的模型基類
  2. D會優先實例化自定義的模型。若自定義模型類不存在,就實例化TP模型基類

1.3 模型的CURD(增刪改查)操作

  1. 增(add、addAll)
  2. 刪(delete)
  3. 改(save)
  4. 查(find、select)
1.3.1 數據寫入(add、addAll)
  1. add方法(寫入單條數據
public function test4(){
        //實例化模型對象
        $model=D('goods');
        //拼接具體要寫入的數據
        //add()實現寫入單條數據,所以寫入一維數組格式
        $data=array(
            'goods_name'=>'test4',
            'goods_time'=>time(),
            'goods_body'=>'test4body'
        );
        $res=$model->add($data);
        dump($res);
    }

在這裏插入圖片描述

  1. addAll方法(寫入多條數據
public function test5(){
        //實例化模型對象
        $model=D('goods');
        //拼接具體要寫入的數據
        //addAll()實現寫入多條數據,所以寫入二維數組格式
        $data=array(
            array('goods_name'=>'test4', 'goods_time'=>time(), 'goods_body'=>'test4body'),
            array('goods_name'=>'test5', 'goods_time'=>time(), 'goods_body'=>'test5body'),
            array('goods_name'=>'test6', 'goods_time'=>time(), 'goods_body'=>'test6body'),
        );
        $res=$model->addAll($data);
        dump($res);
    }

在這裏插入圖片描述

1.3.2 數據修改
  1. save指定修改條件
  • save會識別主鍵標識,如下的代碼goods_id爲主鍵
public function test6(){
        $model=D('goods');
        $data=array(
            'goods_id'=>3,//指定修改id爲3的數據
            'goods_name'=>'testSave'
        );
        $res=$model->save($data);
        dump($res);
    }
  • dump若返回int(1),標識受影響一行
  • 若返回0,表示沒有數據進行更新操作
  1. where指定修改條件
public function test7(){
        $model=D('goods');
        $data=array(
            'goods_name'=>'testSave'
        );
        $res=$model->where("goods_name='test5'")->save($data);
        dump($res);
    }
  • where方法可以使用數組格式指定條件
  • == 也可以使用原生SQL語句中的where子句==
  1. setField更新個別字段
public function test8(){
        $model=D('goods');
        //修改多個字段
        $model->where('goods_id=6')->setField(
          array(
              'goods_name'=>'testSetField',
              'goods_body'=>'testSetFieldBody'
          )
        );
        //修改單個字段
        $model->where('goods_id=7')->setField('goods_name','testSetField');
    }
  1. setIncsetDec
    setInc:指定某個字段的值進行增加操作
    setDec:指定某個字段的值進行減少操作
public function test9(){
        $model=D('goods');
        //實現增加操作,默認爲加1
        $model->where('goods_id=9')->setInc('addtime');
        //實現減少操作,第二個參數指定減少的值
        $model->where('goods_id=10')->setDec('addtime',100);
    }
1.3.3 數據查詢
  1. find:獲取一條數據,返回數據格式是一維數組
  2. select:獲取多條數據,返回數據格式是二維數組
public function test10(){
        $model=D('goods');
        //獲取一條數據
        $data=$model->where('goods_id=1')->find();
        dump($data);
        //獲取多條數據
        $data=$model->where("goods_name='testSave'")->select();
        dump($data);
    }

在這裏插入圖片描述

1.3.4 數據刪除
public function test11(){
        $model=D('goods');
        //直接調用delete方法刪除非常危險,必須加入where條件
        $res=$model->where('goods_id=2')->delete();
        //獲取最後執行的SQL語句
        echo $model->getLastSql();
        dump($res);
    }

在這裏插入圖片描述

1.5 數據表字段定義

  • 在自定義的模型中將具體的字段信息保存到某個屬性中(固定的屬性名稱)。本質就是將具體的字段信息保存到變量中。變量會載入到內存。由於內存的速度比磁盤更快。所以字段定義字段緩存效果更高
1.5.1 修改Goods模型
在GoodsModel.class.php中寫入:
class GoodsModel extends Model{
    //通過屬性指定主鍵字段信息
    protected $pk='goods_id';
    //實現字段定義功能
    //將每個字段寫入到對應數組中,每個字段就是一個元素
    //必須寫全字段
    protected $fields=array('goods_name','goods_name','goods_img','addtime','goods_body');

}

在這裏插入圖片描述

1.6 數據創建

  • create方法默認只能處理post方式
  • 在GoodsModel.class.php中寫入:
public function add(){
        if(IS_GET){
            $this->display;
        }else{
            //post表單提交
            $model=D('Goods');
            $data=$model->create();
            dump($data);
        }
    }

1.7 字段映射

  • 隱藏真實字段名,用別名代替
在GoodsModel.class.php中寫入:
//字段的映射功能,對應的是數組格式
    protected $_map=array(
        'name'=>'goods_name',
        'pic'=>'goods_img',
        'body'=>'goods_body'
    );

1.8 自動驗證

1.8.1 驗證規則
  1. 靜態方式:在模型類通過$_validate屬性定義規則
  2. 動態方式:使用模型類的validate方法動態創建自動驗證規則
  • 格式:
arrayarray(驗證字段1,驗證規則,錯誤提示,[ 驗證條件,附加規則,驗證時間 ]),
	array(驗證字段2,驗證規則,錯誤提示,[ 驗證條件,附加規則,驗證時間 ]),
	....
  • 驗證規則一般跟附加規則配合使用
驗證條件 說明
self::EXISTS_VALIDATE或0 存在字段就驗證(默認)
self::MUST_VALIDATE或1 必須驗證
self::VALUE_VALIDATE或2 值不爲空時驗證
常用附加規則 說明
regex 正則驗證,定義的驗證規則是一個正則表達式
function 函數驗證,定義的驗證規則是一個函數名
callback 方法驗證,定義的驗證規則是當前模型類的一個方法
驗證時間 說明
self::MODEL_INSERT或1 新增數據時驗證
self::MODEL_UPDATE或2 編輯數據時驗證
self::MODEL_BOTH或3 全部情況下驗證(默認)
1.8.2 舉例
在GoodsModel.class.php中寫入:
protected $_validate=array(
        array('goods_name','checkName','goods_name error',1,'callback'),
        array('goods_price','checkPrice','goods_price error',1,'function'),
        array('goods_body','require','goods_body error',1,'regex'),
        //若goods_body字符爲空,就返回錯誤,錯誤提示'goods_body error'
    );
    public function checkName($goods_name){
        if(mb_strlen($goods_name,'utf8')>3){
        	//若goods_name字符大於3,就返回錯誤,錯誤提示'goods_name error'
            return false;
        }
        return true;
    }
在Application\Common\Common\function.php中寫入:
function checkPrice($goods_price){
    if($goods_price<=0){
    	//若goods_price字符小於等於0,就返回錯誤,錯誤提示'goods_price error'
        return false;
    }
    return true;
}

1.9 自動完成

  • 使用create創建數據TP會自動對接收的內容進行增加或修改的操作
  1. 靜態方法:在模型類通過$_auto屬性定義處理規則
  2. 動態方法:使用 模型類的auto方法創建自動處理規則
  • 格式:
arrayarray(完成字段1,完成規則,[ 完成條件,附加規則 ]),
	array(完成字段2,完成規則,[ 完成條件,附加規則 ]),
	....
在GoodsModel.class.php中寫入:

    public function add(){
        if(IS_GET){
            $this->display();
        }else{
            //post表單提交
            $model=D('Goods');
            //定義自動完成規則
            $auto=array(
                array('addtime','time',1,'function')
            );
            $data=$model->auto($auto)->create();
            //$this->display();
            if(!$data){
                //說明目前有數據格式不滿足要求
                //獲取錯誤信息
                dump($model->getError());
            }
            dump($data);
        }
    }

在這裏插入圖片描述

1.10 統計查詢方法

1.10.1 查看統計查詢中的方法
方法 說明(參數是要統計的字段名)
Count 統計數量
Max 獲取最大值
Min 獲取最小值
Avg 獲取平均值
Sum 獲取總分
public function test12(){
        //header('content-type:text/html;charset=utf8');
        $model=D('Goods');
        //計算當前數據的總行數
        echo $model->count();
        echo '<hr/>';
        //計算id中的最大值
        echo $model->max('goods_id');
        echo '<hr/>';
        //計算id的和
        echo $model->sum('goods_id');
        echo '<hr/>';
        //使用where指定條件進行查詢
        echo $model->where("goods_name='testSave'   ")->sum('goods_id');
        echo '<hr/>';
    }

開啓開發者工具

在Common\Conf\config.php中添加配置信息

SHOW_PAGE_TRACE’=>true,即可開啓
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章