總結回顧---2
(1)AR
簡介:AR模式即Active Record模式,是一個對象關系映射(ORM) 技術。每個AR 類代表一張數據表(或視圖), 數據表(或視圖)的字段在AR 類中體現為類的屬性,一個AR實例
則表示表中的。
AR模式核心:三個映射 / 對應
AR類 == 表;(模型類關聯了數據表)
AR類屬性 == 表的字段;
AR類實例 == 表的記錄;
AR模式在ThinkPHP中的典型應用:CURD操作
3個映射關系→類映射到表;屬性映射到字段;實例映射到記錄
$result= $model ->add();//返回新增記錄的主鍵id $result = $model ->save();//返回值為影響行數 在ThinkPHP裏,AR模式沒有查詢操作。所以這裏的查詢操作還是使用之前的select和find方法 $result = $model -> delete();
(2)Tp常見的輔助方法
原生SQL語句裏除了目前所使用的基本操作增刪改查,還有類似於group、where、order、limit等這樣的字句。
ThinkPHP封裝了相應的子句方法:封裝的方法都在父類模型Model.class.php
where 表示限制查詢的條件
limit 限制輸出的條數
filed 限制輸出的字段,也就是select id,name,age等類似語句
註意:下面兩個方法在父類模型中不存在,方法不存在會走魔術方法__call(),利用__call()方法實現一些特殊的Model方法,而group和order在鏈操作方法列表,經過__cal()方法調用。實現相應方法。除此外還有alias(別名),having(限制查詢條件),distinct(去重),filter(過濾)。
order 字段排序
group 按照指定字段進行分組查詢,案例:查詢部門表,查詢出部門名稱和出現的次數
publicfunction test(){ //實例化模型 $model = M(‘dept‘); //指定字段和分組 $model -> group(‘name‘); $model -> field(‘name,count(*) as count‘); // dump($model);die; //查詢 $data = $model -> select(); dump($data); }
(3)連貫操作
將輔助方法全部寫在一行上的寫法為連貫操作
語法:$model -> where() -> limit() ->order() -> field() -> select{}
中間標紅的即為輔助方法
輔助方法順序:在連貫操作裏,沒有順序要求。只要模型在頭部,CURD方法在尾部即可
(4)Tp中的統計查詢
ThinkPHP中系統封裝了以下幾個查詢方法的使用,方便後期統計的使用。以下幾個查詢方法在父類模型中不存在,都是由魔術方法__call()生成的
包含count(),max(),min(),avg(),sum()
①count() 查詢表中總的記錄數(有where時表示查詢指定條件的記錄數)
②max() 查詢某個字段的最大值
③min() 查詢某個字段的最小值
④avg() 查詢某個字段的平均值
⑤sum() 查詢某個字段的總和
(5)thinkphp模型(M)拓展
1.創建數據對象
數據對象就是父類模型中的$this->data,AR模式的底層數據操作用到了數據對象。模型實例化之前數據對象只是空數組,後來使用了魔術方法__set設置了數據對象的值。
上述流程可以得出,使用數據對象前必須先創建數據對象。__set是設置數據對象的一種方法,但是應用時不便,設置一個屬性就得設置一行代碼。
因此ThinkPHP中系統封裝了批量設置數據對象的方法:create方法
語法:$model->create();
2.自動驗證:自定義規則,
①驗證失敗:
此時提交空表單,輸出返回值dump($data);die;瀏覽器輸出false。為什麽是false?這裏我們可以看父類模型,因為這裏返回false
// 數據自動驗證 if(!$this->autoValidation($data,$type)) return false;
②驗證成功:如果驗證成功,則返回正常數組
輸出用戶提示信息:$model->getError();
3.批量驗證
一次性驗證全部字段,需要配置成員屬性
系統支持數據的批量驗證功能,只需要在模型類裏面設置patchValidate屬性為true( 默認為false)
(6)字段映射
①映射表示對應關系
②應用場景:目前表單中的name值和數據表中的字段名一致,有一些人可能通過當前的功能和表單的name值猜測出表名字和表結構。後期可能會找到系統的漏洞,對系統進行
攻擊。系統的安全性存在威脅。因此可以使用類似障眼法,將name值隨機指定,這時name值和表字段不一致,那樣也就猜測不出表結構了。
語法:沒有語法、、、、只有規則定義$_map,與自動驗證一樣,在父類模型裏有過定義
// 查詢表達式參數 protected $_validate = array(); // 自動驗證定義 protected $_map = array(); // 字段映射定義
將其復制到自定義子模型定義,
(7)特殊表的實例化操作
表沒有前綴,或者表前綴不是配置文件裏定義的前綴,這些都是特殊表
實例化時會將前綴和表名自動連接起來,所以會報錯提示sp_szphp表不存在。
解決辦法:看下父類模型文件關於數據表名的定義
// 數據表名(不包含表前綴) protected $tableName = ‘‘; // 實際數據表名(包含表前綴) protected $trueTableName = ‘‘;//告知系統當前模型所關聯的表的真實表名,且是已經包含前綴的表名
這裏我們選第二個,告訴ThinkPHP,這張表名已經包含前綴了,不要再加前綴。
通過父類模型屬性中的成員屬性trueTableName屬性,進行表名的指定。告知模型表名真實名字,讓其不要再關聯上前綴。
(8)會話控制
會話支持一般指cookie和session,在ThinkPHP裏為了方便開發,封裝了cookie和session方法。
1. session方法
在函數庫封裝了session方法
session(‘name‘,‘value‘) 創建一個名為name的session,值為value
$value = session(‘name‘) 讀取session中的name元素值,並賦值給變量$value
session(‘name‘,null) 刪除session中名為name元素的值
session(null) 刪除全部session值
session() 讀取全部的session信息
session(‘?name‘) 判斷名為name的session元素是否存在,存在返回true,否則返回false
cookie方法
2. 在函數庫封裝了cookie方法
cookie(‘name‘,‘value‘) 創建一個名為name的cookie,值為value
cookie(‘name‘,‘value‘,3600) 創建一個名為name的cookie,值為value,有效期為3600s
$value=cookie(‘name‘) 讀取名為name的cookie,賦值給value
cookie(‘name‘,null) 刪除名為name的cookie
cookie(null) 刪除所有,但是測試後發現無效。查看手冊,發現該方法有BUG。若想實現,則需更改底層實現代碼。需要修改底層代碼
cookie() 獲取全部的cookie註意:若不指定時間,則session會話結束時到期。
// 清除指定前綴的所有cookie if (is_null($name)) { if (empty($_COOKIE)) return null; // 要刪除的cookie前綴,不指定則刪除config設置的指定前綴 $prefix = empty($value) ? $config[‘prefix‘] : $value; if (!empty($prefix) || $name == null) {// 如果前綴為空字符串將不作處理直接返回 foreach ($_COOKIE as $key => $val) { if (0 === stripos($key, $prefix)||$name == null) {//函數庫1379行 setcookie($key, ‘‘, time() - 3600, $config[‘path‘], $config[‘domain‘],$config[‘secure‘],$config[‘httponly‘]); unset($_COOKIE[$key]); } } } return null; }elseif(‘‘ === $name){ // 獲取全部的cookie return $_COOKIE; }
.
總結回顧---2