文章出處

ThinkPHP 內置了抽象數據庫訪問層,把不同的數據庫操作封裝起來。我們只需要使用
公共的 Db 類進行操作,無須針對不同的數據庫寫不同的代碼和底層實現。Db 類會自動調用
相應的數據庫驅動來處理。

 

一、全局配置定義  

 common/conf/config.php 

'DB_TYPE'=>'mysql', //數據庫類型
'DB_HOST'=>'localhost', //服務器地址
'DB_NAME'=>'thinkphp', //數據庫名
'DB_USER'=>'root', //用戶名
'DB_PWD'=>'123456', //密碼
'DB_PORT'=>3306, //端口
'DB_PREFIX'=>'think_', //數據庫表前綴,因為建立的數據表名稱為think_user

在 Home/Controller/UserController.calss.php 中

<?php
namespace Home\Controller;
use Think\Controller;
use Think\Model;//加載數據庫模塊

class UserController extends Controller {
    public function model() {
        $user = new Model('User');//User最好大寫
var_dump($user->select()); //select是選擇數據表中的數據
  }
}

二、PDO專用定義

  common/conf/config.php  

    'DB_TYPE'=>'pdo',
    'DB_USER'=>'root',
    'DB_PWD'=>'123456',
    'DB_PREFIX'=>'think_',
    'DB_DSN'=>'mysql:host=localhost;dbname=thinkphp;charset=UTF8',

在 Home/Controller/UserController.calss.php 不變

 

三、直接在 Home/Controller/UserController.calss.php 寫,不需要在  common/conf/config.php  插入任何代碼

 

<?php
namespace Home\Controller;
use Think\Controller;
 use Think\Model; 

class UserController extends Controller {
    public function model() {
        $user = new Model('User','think_','mysql://root:123456@localhost/thinkphp');//User中的U 建議大寫
        var_dump($user->select());    
    }
}

 

最后說一點,就是model()函數內的 $user = new Model('User'); 可以替換為 $user = M ('User');  這時,可不在引用 use Think\Model; 

 

四、除了使用 Model 基類和 M()方法,還有一種對應數據表的模型定義,比如:UserModel。

這種模型類并非必須定義的,只有當存在獨立的業務邏輯或者屬性的時候才需要。

首先在 Home/Model 下新建 UserModel.class.php ,內部代碼為:

<?php
namespace Home\Model;
use Think\Model;

class UserModel extends Model {
//這里面是不用插入代碼的 }

然后在 Home/controller/UserController.class.php 寫入下列代碼:

<?php
namespace Home\Controller;
use Think\Controller;
use Home\Model\UserModel;

class UserController extends Controller {
    public function model() {
        $user = new UserModel();
        var_dump($user->select());    

    }
}

記得在 common/conf/config.php 寫入下列連接數據庫的代碼

<?php
return array(
    //PDO專用定義
    'DB_TYPE'=>'pdo',
    'DB_USER'=>'root',
    'DB_PWD'=>'6Vpsu9GdGHe26cxR',
    'DB_PREFIX'=>'think_',
    'DB_DSN'=>'mysql:host=localhost;dbname=thinkphp;charset=UTF8',
    
    //頁面調試工具Trace
   'SHOW_PAGE_TRACE'=>true,

);

這是在瀏覽器調用 Home/controller/UserController.class.php ,就能得到數據庫中的信息,

為什么 UserModel 模型類沒有指定任何表即可直接訪問呢?因為這種模型類基本是直
接操作數據表的,所以在命名規范上和數據表名是對應的。(建立的數據表名稱是thinkphp.think_user,其中thinkphp是數據庫名,think_user是數據表名)

雖然使用模型類和數據表對應較為方便,但當有時我們需要更換表名、前綴、附加數據
庫名等,就需要一些字段定義的操作。為了更加方便的了解數據表的變化,我們使用一下頁
面 Trace 工具,可以時時的查詢 SQL 的變化。在 common/conf/config.php 中插入

//頁面Trace,調試輔助工具
 'SHOW_PAGE_TRACE' => true, 

這時,在瀏覽器的右下角處出現:

,點擊該圖標,點擊SQL,出現下圖

這時,在 Home/Model/UserModel.class.php 中寫入下列代碼:

<?php
namespace Home\Model;
use Think\Model;

class UserModel extends Model {
    protected $tablePrefix = 'tp_';//重新定義表前綴
}

這時點擊調試,則可發現:

 

 

瀏覽器在出現

類似的,下圖是改變數據庫的其他類型:

<?php
namespace Home\Model;
use Think\Model;

class UserModel extends Model {
    //protected $tablePrefix = 'tp_';   改變數據表的前綴 -> tp_user
    //protected $tableName='abc';  改變數據表的名字 ->  think_abc
    //protected $trueTableName='abc';改變數據表的整個名字 ->  thinkphp.abc
    //protected $dbName='abc';改變數據庫的名字->  abc.think_user
}

 

注:

如果你僅僅使用 CURD 等數據庫基本操作,我們建議使用基于 Model 基類的 M()方法。
使用 M()方法由于不需要加載具體的模型類(比如 UserModel 類),所以性能會更高。

 

五、

當然,如果有必要使用具體的模型類時,ThinkPHP 還提供了 D()方法來直接是實例化
模型類,并且還可以免去引入命名空間等操作。

在 Home/controller/UserController.class.php 中

//實例化UserModel類
$user = D('User');
var_dump($user->select());

PS:使用 D()方法比直接使用模型類更加的智能,如果在 \Home\Model\UserModel  找

不到該模型類,那么就會去公共模塊下找 \Common\Model\UserModel  去找。如果還找不到,
就會直接實例化基類 Model()類,也就是等同于使用 M()方法。
D()方法可以直接調用當前模塊的模型類,那么如果跨模塊調用的話,那怎么處理呢?
比如 Admin 后臺模塊,可以使用目錄聲明。
//跨模塊實例化
 $user = D('Admin/User'); 
有時,你可能想使用原生的 SQL 語句進行操作數據庫。那么可以采用實例化空模型基
類或者空 M()方法。

//空 M()方法
$user = M(); //或者new Model();空基類
var_dump($user->query("SELECT * FROM think_user WHERE user='蠟筆小新'"));

 

附錄:

字段定義:
  每個模型類操作著每個對應的數據表,在大多數情況下,系統會自動獲取當前數據表的
字段信息。而當模型類第一次實例化時,系統會自動緩存字段,并且永久緩存,除非刪除了
運行時緩存或者設置不緩存。
  如果調試模式下,則不會生成字段緩存文件,每次都是從數據表里重新獲取。生成緩存
的目的顯而易見,就是為了快速響應。ThinkPHP 默認是開啟字段緩存,因為在實際運行中,
不會更改字段結構。
  字段緩存文件保存在 Runtime/Data/_fields/目錄里,當你在開發階段,字段和表會經常
變動,所以要關閉緩存。關閉緩存的方法為:
// 關閉字段緩存
 'DB_FIELDS_CACHE'=> false //開啟了調試模式,自動關閉 
PS:如果開啟緩存狀態,新增了字段,那么可能新字段無法刷新出來,必須刪除
 /Data/_fields  文件夾,重新獲取字段。
//查看字段結構
 var_dump($user->getDbFields()); 
你也可以使用手動定義數據表字段的方式取代字段緩存方式,這種方式可以提高性能,
避免 IO 開銷。

//手動定義數據表字段,_pk表示主鍵
 class UserModel s extends Model {
 protected $fields =  array('id', 'user', '_pk'=>'id');
}
//type 定義每個字段的類型,可以永遠字段驗證
 class UserModel s extends Model {
 protected $fields =  array('id', 'user', '_pk'=>'id',
'type'=> array('id'=>'smallint','user'=>'varchar'));
}

 舉例

在 index.php 中設置:

// 關閉字段緩存
 'DB_FIELDS_CACHE'=> false //開啟了調試模式,自動關閉 

然后在 Home/controller/UserController.class.php 中

<?php

namespace Home\Controller;
use Think\Controller;
use Think\Model;

class UserController extends Controller {
   
    public function model() {        
        $user = new Model('User');
        var_dump($user->getDbFields());
    }
}

這時在瀏覽器中刷新后就會顯示數據表的字段:

這時在數據表中添加一段數據:

但刷新后瀏覽器中的數據表的字段還是不變,

在 index.php 中打開調試后 'DB_FIELDS_CACHE'=> ture; 這時再刷新

則添加的新的字段也會顯示


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()