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; 這時再刷新
則添加的新的字段也會顯示
文章列表