在ThinkPHP中,可(kě)以無需進行(xíng)任→§↑何模型定義。隻有(yǒu)在需要(yào)封裝單獨的∞✘ δ(de)業(yè)務邏輯的(de)時(shí)候,φ↓↔ 模型類才是(shì)必須被定義的(de),因此ThinkPHP在模型上(s∑¥πhàng)有(yǒu)很(hěn)多(duō)的(de)靈∏$₽β活和(hé)方便性,讓你(nǐ)無需因為≠β→'(wèi)表太多(duō)而煩惱。
根據不(bù)同的(de)模型定義,我們←∞λ有(yǒu)幾種實例化(huà)模型的(de)方法,根據需要(yào)♥§采用(yòng)不(bù)同的(de)方式:
直接實例化(huà)
可(kě)以和(hé)實例化(huà)其他(tā)類庫一(®₩φyī)樣實例化(huà)模型類,例如(rú★λ←):
$User = new \Home\Model\UserModel();$Info = new \Admin\Model\InfoModλ÷→el();// 帶參數(shù)實例化(huà)$New = new \Home\Model\NewModel('blog','think_',$connection);
模型類通(tōng)常都(dōu)是(shì β)繼承系統的(de)\Think\Model類,該類的(de)架構方法≠> ★有(yǒu)三個(gè)參數(shù),分(fēn)别是(shì):'₹↔ε
Model(['模型名'],['數(shù)據表前綴'],['數(s≈§hù)據庫連接信息']);
三個(gè)參數(shù)都(dōu)是(shì)可(kě)選的(d™↓εδe),大(dà)多(duō)數(shù)情況下(xià),我們根本無需傳入任≈<±何參數(shù)即可(kě)實例化(huà)。
| 參數(shù) | 描述 |
|---|---|
| 模型名 | 模型的(de)名稱 和(hé)數(shù)據表前綴一(yī)起配合用(yòn↕↔εg)于自(zì)動識别數(shù)據表名稱 |
| 數(shù)據表前綴 | 當前數(shù)據表前綴 和(hé)模型名一(yī)起配合用(yòn±δg)于自(zì)動識别數(shù)據表名稱 |
| 數(shù)據庫連接信息 | 當前數(shù)據表的(de)數(shù)據庫連接信息ε® 如(rú)果沒有(yǒu)則獲取配置文(wén)件(jiα¥∏↑àn)中的(de) |
如(rú)果當前數(shù)據表沒有(yǒu)↑γ✘前綴,則傳入空(kōng)字符串即可(kě)
數(shù)據庫連接信息參數(shù)支持三種格式:
1、字符串定義
字符串定義采用(yòng)DSN格式定義σ ₽σ,格式定義規範為(wèi):
type://username:passwd@host &name:port/DbName// 3.2.1以上(shàng)版本還(hái)可(kě)以支₹ 持字符集設定type://username:passwd@hostname:port/£✔↓DbName#charset
例如(rú):
new \Home\Model\NewModel('blog','think_','mysql://root:1234@localhost/★¥demo');
2、數(shù)組定義
可(kě)以傳入數(shù)組格式的(de)數(₩&₩shù)據庫連接信息,例如(rú):
$connection = array('db_type' => 'mysql','db_host' => '127.0.0.1','db_user' => 'root','db_pwd' => '12345','db_port' => 3306,'db_name' => 'demo',);new \Home\Model\NewModel('new','think_',$connection);
3.2.1以上(shàng)版本還(hái)可(kě)以≈®©∑支持數(shù)據編碼設定,例如(rú):
$connection = array('db_type' => 'mysql','db_host' => '127.0.0.1','db_user' => 'root','db_pwd' => '12345','db_port' => 3306,'db_name' => 'demo','db_charset' => 'utf8',);new \Home\Model\NewModel('new','think_',$connection);
3、配置定義
我們可(kě)以事(shì)先在配置文(wén)件(ji©≈àn)中定義好(hǎo)數(shù)據庫連接信息,然後在實例化(huΩ↓♥à)的(de)時(shí)候直接傳入配置的(de)名稱即可(≠α©×kě),例如(rú):
//數(shù)據庫配置1'DB_CONFIG1' => array('db_type' => 'mysql','db_user' => 'root','db_pwd' => '1234','db_host' => 'localhost','db_port' => '3306','db_name' => 'thinkphp'),//數(shù)據庫配置2'DB_CONFIG2' => 'mysql://root:1234@localho¥£st:3306/thinkphp',
在配置文(wén)件(jiàn)中定義數(shù)據庫×®'連接信息的(de)時(shí)候也(yě)支持字符串和(hé)數(shù∞≥)組格式,格式和(hé)上(shàng)面實₩∏♦↓例化(huà)傳入的(de)參數(shù)一(yī)樣。₩≤
然後,我們就(jiù)可(kě)以這(zhè)樣實例化(huà)模型類傳入連接δ♠δ信息:
new \Home\Model\NewModel('new','think_','DB_CONFIG1');new \Home\Model\BlogModel('blog','think_','DB_CONFIG2');
事(shì)實上(shàng),當我們實例 £↕★化(huà)的(de)時(shí)候沒有(yǒu)傳入任何的(de)數(sφ≥×♠hù)據庫連接信息的(de)時(shí)候,系統其實默認會(huì)獲取配¥×置文(wén)件(jiàn)中的(de)相↓→¥(xiàng)關配置參數(shù),包括:
'DB_TYPE' => '', // 數(shù)據庫類型'DB_HOST' => '', // 服務器(qì)地(dì)址'DB_NAME' => '', // 數(shù)據庫名'DB_USER' => '', // 用(yòng)戶名'DB_PWD' => '', // 密碼'DB_PORT' => '', // 端口'DB_PREFIX' => '', // 數(shù)據庫表前綴'DB_DSN' => '', // 數(shù)據庫連接DSN 用(y→γ↕òng)于PDO方式'DB_CHARSET' => 'utf8', // 數(shù)據庫的(de)編碼 默認為(wèi)utf8
如(rú)果應用(yòng)配置文(wén)件(jiàn)'ε♥中有(yǒu)配置上(shàng)述數(s☆γhù)據庫連接信息的(de)話(huà),實例化(huà)模↔↑>β型将會(huì)變得(de)非常簡單。
D方法實例化(huà)
上(shàng)面實例化(huà)的(d≈∞e)時(shí)候我們需要(yào)傳入≈•€完整的(de)類名,系統提供了(le)一(yī)個✘÷$♣(gè)快(kuài)捷方法D用(yòng)于數(shù)據模型的 ✘ (de)實例化(huà)操作(zuò)。
要(yào)實例化(huà)自(zì)定義模型類,可(kě)以使用(yòng¥☆)下(xià)面的(de)方式:
php//實例化(huà)模型$User = D('User');// 相(xiàng)當于 $User = new \←§≠Home\Model\UserModel();// 執行(xíng)具體(tǐ)的(de)數(shù)據操作(ε↓<zuò)$User->select();
當
\Home\Model\UserModel類不(bù)存在的(de)時(shí)候,D函數®¶(shù)會(huì)嘗試實例化(huà)公共↕₹模塊下(xià)面的(de)\Common\Model\UserModel類。
D方法的(de)參數(shù)就(jiù)是(shì)模型的(de)♥☆§名稱,并且和(hé)模型類的(de)大(dα→↕à)小(xiǎo)寫定義是(shì)一(yī)緻的(d$αe),例如(rú):
| 參數(shù) | 實例化(huà)的(de)模型文(wén)件(jiàn)(假設當前模塊為γ♣(wèi)Home) |
|---|---|
| User | 對(duì)應的(de)模型類文(wén)件(ji↓àn)的(de) \Home\Model\UserModλ♣•el.class.php |
| UserType | 對(duì)應的(de)模型類文(wén)件(↔$πjiàn)的(de) \Home\Model\UserTypeModel.§ ∑class.php |
如(rú)果在Linux環境下(xià)面,一(yī)定要(yào)注意×β↑÷D方法實例化(huà)的(de)時(shí)候的₹β∏'(de)模型名稱的(de)大(dà)小(xiǎo)寫。
D方法可(kě)以自(zì)動檢測模型類,如(rú)果存在自(z→♠☆ì)定義的(de)模型類,則實例化(huà)自(zì)定義模型類,•♣™如(rú)果不(bù)存在,則會(huì)實例化(huà)系統的(deγ≥)\Think\Model基類,同時(shí)對(du₹β★βì)于已實例化(huà)過的(de)模型,不(bù)會(hπ&λuì)重複去(qù)實例化(huà)。
D方法還(hái)可(kě)以支持跨模塊調用(yòng),需要(yào)使用(y♠÷¥òng)://實例化(huà)Admin模塊的(de)User模型D('Admin/User');//實例化(huà)Extend擴展命名空(kō"↓✔ng)間(jiān)下(xià)的(de)Info模型D('Extend://Editor/Info');
注意:跨模塊實例化(huà)模型類的(de)時(shí)候 不(bù)支&♦↕¥持自(zì)動加載公共模塊的(de)模型類。
M方法實例化(huà)模型
D方法實例化(huà)模型類的(de)時(shí)候通(tōng)§δ§常是(shì)實例化(huà)某個(gè)具體(tǐ)的(d<↓₽↑e)模型類,如(rú)果你(nǐ)僅僅是(s<÷β≈hì)對(duì)數(shù)據表進行(xíng)基σ∑'€本的(de)CURD操作(zuò)的(de)話(h∏™uà),使用(yòng)M方法實例化(huà)的(de)話(÷↔±huà),由于不(bù)需要(yào)加載具體(tǐ)的(β≤÷de)模型類,所以性能(néng)會(huì)更高(gā☆Ω'o)。
例如(rú):
// 使用(yòng)M方法實例化(huà)$User = M('User');// 和(hé)用(yòng)法 $User = new \Thi↑←nk\Model('User'); 等效// 執行(xíng)其他(tā)的(de)數(shù)據₩ ©操作(zuò)$User->select();
M方法也(yě)可(kě)以支持跨庫操作(zuò),例 >☆§如(rú):
// 使用(yòng)M方法實例化(huà) 操作(zuò)db_n"₽ame數(shù)據庫的(de)ot_user表$User = M('db_name.User','ot_');// 執行(xíng)其他(tā)的(de)數(shù)據操作(zuò)±↔$User->select();
M方法的(de)參數(shù)和(hé)\Think\Model類的(≤≈©↓de)參數(shù)是(shì)一(yī)樣的(de),'÷±≥也(yě)就(jiù)是(shì)說(shuō),我們也(← ±&yě)可(kě)以這(zhè)樣實例化(®×huà):
$New = M('new','think_',$connection);// 等效于 $New = new \Thin®∞☆₹k\Model('new','think_',$connection);
具體(tǐ)的(de)參數(shù)含義可(kě)以參考前面的(de)介紹∑≈★。
M方法實例化(huà)的(de)時(shí)候,默認情況下(x× ♠ià)是(shì)直接實例化(huà)系統的(de)\Think\Mo→$del類,如(rú)果我們希望實例化(huà)其他(tā)的(deβ×)公共模型類的(de)話(huà),可(kě£≤)以使用(yòng)如(rú)下(xià)方法:
$User = M('\Home\Model\CommonModel:User≈→•','think_','db_config');// 相(xiàng)當于 $User =✘©$ new \Home\Model\Commo♥∑nModel('User','think_','db_confi÷ ☆g');
如(rú)果你(nǐ)的(de)模型類有(yǒu)自(zì)己的(de>®)業(yè)務邏輯,M方法是(shì)無法支持的(de),就☆♥(jiù)算(suàn)是(shì)你(nǐ)已經定義了(le€→φ★)具體(tǐ)的(de)模型類,M方法實例化(huà)的∑♥₩≠(de)時(shí)候是(shì)會(huì) 直接忽略。
實例化(huà)空(kōng)模型類
如(rú)果你(nǐ)僅僅是(shì)使用(yòng)原生(shēn> g)SQL查詢的(de)話(huà),不(bù)需要(yào)使用₩↔φ(yòng)額外(wài)的(de)模型類,實例化(huà)一 εα☆(yī)個(gè)空(kōng)模型類即可(kě)進行(xíπ↓™ng)操作(zuò)了(le),例如(rú):
//實例化(huà)空(kōng)模型$Model = new Model();//或者使用(yòng)M快(kuài)捷方法是(shì)等效ΩΩ÷♣的(de)$Model = M();//進行(xíng)原生(shēng)的(de)SQL查詢$Model->query('select * FROM think_user Wδ→εHERE status = 1');
實例化(huà)空(kōng)模型類後還(hái)可(kě)以用₽±>(yòng)table方法切換到(dào)具體"¶(tǐ)的(de)數(shù)據表進行(xín☆♦γ≈g)操作(zuò)
我們在實例化(huà)的(de)過程中,經常使用♦¶(yòng)D方法和(hé)M方法,這(zhè≠↕)兩個(gè)方法的(de)區(qū)别在于M方法實例化'≠(huà)模型無需用(yòng)戶為(wèi)每個(gè)數(shù)據表定€< 義模型類,如(rú)果D方法沒有(yǒu)找到(dào≤≤)定義的(de)模型類,則會(huì)自(zì)動調用('£÷yòng)M方法。




