【小(xiǎo)編推薦】ThinkPHP3.2——模型實例'±化(huà)

2014-06-26  λ→ |  & ©≥λnbsp;發布者:梁國(guó)芳   |&×α¥nbsp;  查看(kàn):33''♠♠20次

Thinkphp

在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ú★λ←):

  1. $User = new \Home\Model\UserModel();
  2. $Info = new \Admin\Model\InfoModλ÷→el();
  3. // 帶參數(shù)實例化(huà)
  4. $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):

  1. type://username:passwd@host &name:port/DbName
  2. // 3.2.1以上(shàng)版本還(hái)可(kě)以支₹ 持字符集設定
  3. type://username:passwd@hostname:port/£✔↓DbName#charset

例如(rú):

  1. new \Home\Model\NewModel('blog','think_','mysql://root:1234@localhost/★¥‌demo');
2、數(shù)組定義

可(kě)以傳入數(shù)組格式的(de)數(₩&₩shù)據庫連接信息,例如(rú):

  1. $connection = array(
  2. 'db_type' => 'mysql',
  3. 'db_host' => '127.0.0.1',
  4. 'db_user' => 'root',
  5. 'db_pwd' => '12345',
  6. 'db_port' => 3306,
  7. 'db_name' => 'demo',
  8. );
  9. new \Home\Model\NewModel('new','think_',$connection);

3.2.1以上(shàng)版本還(hái)可(kě)以≈®©∑支持數(shù)據編碼設定,例如(rú):

  1. $connection = array(
  2. 'db_type' => 'mysql',
  3. 'db_host' => '127.0.0.1',
  4. 'db_user' => 'root',
  5. 'db_pwd' => '12345',
  6. 'db_port' => 3306,
  7. 'db_name' => 'demo',
  8. 'db_charset' => 'utf8',
  9. );
  10. new \Home\Model\NewModel('new','think_',$connection);
3、配置定義

我們可(kě)以事(shì)先在配置文(wén)件(ji©≈àn)中定義好(hǎo)數(shù)據庫連接信息,然後在實例化(huΩ↓♥à)的(de)時(shí)候直接傳入配置的(de)名稱即可(≠α©×kě),例如(rú):

  1. //數(shù)據庫配置1
  2. 'DB_CONFIG1' => array(
  3. 'db_type' => 'mysql',
  4. 'db_user' => 'root',
  5. 'db_pwd' => '1234',
  6. 'db_host' => 'localhost',
  7. 'db_port' => '3306',
  8. 'db_name' => 'thinkphp'
  9. ),
  10. //數(shù)據庫配置2
  11. '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à)模型類傳入連接δ♠δ信息:

  1. new \Home\Model\NewModel('new','think_','DB_CONFIG1');
  2. 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ù),包括:

  1. 'DB_TYPE' => '', // 數(shù)據庫類型
  2. 'DB_HOST' => '', // 服務器(qì)地(dì)址
  3. 'DB_NAME' => '', // 數(shù)據庫名
  4. 'DB_USER' => '', // 用(yòng)戶名
  5. 'DB_PWD' => '', // 密碼
  6. 'DB_PORT' => '', // 端口
  7. 'DB_PREFIX' => '', // 數(shù)據庫表前綴
  8. 'DB_DSN' => '', // 數(shù)據庫連接DSN 用(y→γ↕òng)于PDO方式
  9. '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)方式:

  1. php
  2. //實例化(huà)模型
  3. $User = D('User');
  4. // 相(xiàng)當于 $User = new \←§≠​Home\Model\UserModel();
  5. // 執行(xíng)具體(tǐ)的(de)數(shù)據操作(ε↓<zuò)
  6. $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à)。

  1. D方法還(hái)可(kě)以支持跨模塊調用(yòng),需要(yào)使用(y♠÷¥òng):
  2. //實例化(huà)Admin模塊的(de)User模型
  3. D('Admin/User');
  4. //實例化(huà)Extend擴展命名空(kō"↓✔ng)間(jiān)下(xià)的(de)Info模型
  5. 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ú):

  1. // 使用(yòng)M方法實例化(huà)
  2. $User = M('User');
  3. // 和(hé)用(yòng)法 $User = new \Thi↑←‍nk\Model('User'); 等效
  4. // 執行(xíng)其他(tā)的(de)數(shù)據₩ ©操作(zuò)
  5. $User->select();

M方法也(yě)可(kě)以支持跨庫操作(zuò),例 >☆§如(rú):

  1. // 使用(yòng)M方法實例化(huà) 操作(zuò)db_n"₽ame數(shù)據庫的(de)ot_user表
  2. $User = M('db_name.User','ot_');
  3. // 執行(xíng)其他(tā)的(de)數(shù)據操作(zuò)±↔
  4. $User->select();

M方法的(de)參數(shù)和(hé)\Think\Model類的(≤≈©↓de)參數(shù)是(shì)一(yī)樣的(de),'÷±≥也(yě)就(jiù)是(shì)說(shuō),我們也(← ±&yě)可(kě)以這(zhè)樣實例化(®×huà):

  1. $New = M('new','think_',$connection);
  2. // 等效于 $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à)方法:

  1. $User = M('\Home\Model\CommonModel:User≈→•','think_','db_config');
  2. // 相(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ú):

  1. //實例化(huà)空(kōng)模型
  2. $Model = new Model();
  3. //或者使用(yòng)M快(kuài)捷方法是(shì)等效ΩΩ÷♣的(de)
  4. $Model = M();
  5. //進行(xíng)原生(shēng)的(de)SQL查詢
  6. $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方法。