abstract:一、創(chuàng)建模型1. 編程方式: application/index/model/Staff.php2. 命令方式:(1)切換think命令所在目錄下;(1)運行: php think make:model index/Staff,自動創(chuàng)建index/model/Staff.php,如果沒有model目錄,則自動創(chuàng)建;(2)運行: php think make:model Staff,如果省略模塊名,
一、創(chuàng)建模型
1. 編程方式: application/index/model/Staff.php
2. 命令方式:
(1)切換think命令所在目錄下;
(1)運行: php think make:model index/Staff,自動創(chuàng)建index/model/Staff.php,如果沒有
model目錄,則自動創(chuàng)建;
(2)運行: php think make:model Staff,如果省略模塊名,默認(rèn)為common模塊,
模型位于:application/common/model/Staff.php,common模塊如果不存在也會自動創(chuàng)建;
3. 默認(rèn)情況下:Staff模型與數(shù)據(jù)表staff對應(yīng)
--------------------------------------------------------------------------------
二、調(diào)用模型
use app\index\model\Staff;
1. 實例化調(diào)用: $staff = new Staff();
2. 靜態(tài)查詢調(diào)用: $staff = Staff::get();
3. 助手函數(shù)調(diào)用: $staff = model('Staff');
不推薦用助手函數(shù),因為model()無法調(diào)用模型靜態(tài)方法
一、Db與模型的區(qū)別與聯(lián)系?
1.Db和模型的職責(zé)和定位不同;
2.Db負責(zé)的只是數(shù)據(jù)(表)訪問;
3.模型是業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯的完美封裝;
4.Db是模型的基礎(chǔ),模型最終實現(xiàn)依賴Db實現(xiàn);
5.重點來了:Db返回是數(shù)組,模型返回的是對象
可能同學(xué)們一時對這些描述不是很理解,相信隨著學(xué)習(xí)的深入和開發(fā)經(jīng)驗的積累,會對模型有更深的理解。
--------------------------------------------------------------------------------
二、模型與數(shù)據(jù)表之間的關(guān)系
1.模型本質(zhì)是一個類,繼承自框架的think\Model.php類;
2.模型大多與一張數(shù)據(jù)表對應(yīng),但并不總是這樣;
3.模型支持ORM(對象關(guān)系映射);
4.模型對應(yīng)數(shù)據(jù)表,而模型實例(對象)對應(yīng)表中的一條記錄
5.模型支持更多的業(yè)務(wù)處理功能:自動完成,自動轉(zhuǎn)換,自動驗證等等,這是Db不具備的
--------------------------------------------------------------------------------
三、關(guān)于Db與模型的幾個誤區(qū)
1.認(rèn)為模型效率不如直接操作Db,其實這點差別相對模型的便利性,簡直可以直接忽略;
2.認(rèn)為為每張數(shù)據(jù)表創(chuàng)建模型無意義,還麻煩,其實這是不對的,通過模型操作數(shù)據(jù)其實更加的安全可靠;
3.認(rèn)為模型的操作不容易掌握,概念不容易理解,恰恰相反,模型相對Db更加的人性,也更貼近開發(fā)需求;
--------------------------------------------------------------------------------
四、模型的優(yōu)勢
1.可以更優(yōu)雅的操作數(shù)據(jù),完全面向?qū)ο缶幊?
2.可以更加的直觀的實現(xiàn)多表的關(guān)聯(lián)操作;
3.可以最大限度的保證用戶數(shù)據(jù)的安全性和完整性;
4.可以非常方便的擴充業(yè)務(wù)邏輯功能;
5.可以極大的減少控制器中的業(yè)務(wù)邏輯代碼.
--------------------------------------------------------------------------------
五、改進要求
1.如果模型中寫了很少的代碼,甚至是空模型,那么要檢查你的業(yè)務(wù)規(guī)劃是不是有了問題
2.如果控制器中寫了大量的數(shù)據(jù)處理代碼,那么最好將這些代碼移到模型中去統(tǒng)一處理
一、獲取器的創(chuàng)建與使用
1.獲取是寫在模型類中的一個方法
2.當(dāng)用戶通過模型獲取表中數(shù)據(jù)時會自動觸發(fā),但也并非絕對如此
3.主要應(yīng)用場景:用于從數(shù)據(jù)表中讀取數(shù)據(jù)
(1)時間日期字段的格式化輸出;
(2)集合或枚舉類型的輸出;
(3)數(shù)字狀態(tài)字段的輸出;
(4)組合字段的輸出
4. 獲取器方法命名規(guī)則:
get字段名Attr(字段值[,所有字段]),例如 getBirthdayAttr($value)
5. 可以讀取不存在的字段信息
--------------------------------------------------------------------------------
二、修改器的創(chuàng)建與使用
1.修改器也是模型類中的一個方法
2.使用場景:
(1)時間日期字段的轉(zhuǎn)換寫入;
(2)集合或枚舉類型的寫入;
(3)數(shù)字狀態(tài)字段的寫入;
(4)某個字段涉及其它字段的條件或者組合寫入
2.在以下5種情況下會觸發(fā)修改器工作
(1)模型對象賦值;
(2)調(diào)用模型的data方法,并且第二個參數(shù)傳入true;
(3)調(diào)用模型的save方法,并且傳入數(shù)據(jù);
(4)顯式調(diào)用模型的setAttr方法;
(5)定義了該字段的自動完成;
--------------------------------------------------------------------------------
三、自動時間戳
1.添加與更新數(shù)據(jù)時,將時間自動寫入到指定字段中
2.可以全局開啟,也可以在模型中單獨開啟
(1)全局設(shè)置:config/database.php
// 自動寫入時間戳字段
'auto_timestamp' => false, //改為true
如果當(dāng)前模型中不需要自動時間戳功能,請手動關(guān)閉
protected $autoWriteTimestamp = false;
(2)模型設(shè)置:
protected $autoWriteTimestamp = true;
**建議在模型中單獨開啟,這樣最靈活,畢竟不是每一張表都需要時間戳字段
3.一旦開啟該功能,用戶更新或添加數(shù)據(jù)時會自動將操作時間寫入到以下二個字段
(1)新增時間: create_time
(2)更新時間: update_time
以上這二個字段名是默認(rèn)值,可以在模型中重新定義
4.不需要為這二個字段設(shè)置修改器,框架會自動處理
--------------------------------------------------------------------------------
三、類型轉(zhuǎn)換
1.表中取出的數(shù)據(jù),默認(rèn)為字符類型
2.在模型中配置: protected $type = ['字段名' => '類型名稱',...]
3.類型中沒有字符型,因為它是默認(rèn)類型,無須轉(zhuǎn)換
--------------------------------------------------------------------------------
四、自動完成
1. 自動完成必須要配合修改器工作;
2. 自動完成是針對寫操作: 新增與更新
3. 通過在模型中設(shè)置三個屬性來配置
4. protected $insert = []; 新增時自動完成
5. protected $update = []; 更新時自動完成
6. protected $auto = []; 新增或更新時自動完成
7. 類似于給表中字段設(shè)置默認(rèn)值
Correcting teacher:天蓬老師Correction time:2018-12-21 12:58:36
Teacher's summary:模型是數(shù)據(jù)與業(yè)務(wù)的封裝,最好的封裝形式當(dāng)然是類了, 所以模型就是一個類,實例化之后,與一張表對應(yīng),這么簡單,好用