ThinkPHP--模型初步
學習要點:
1.創建數據庫
2.實例化模型
3.字段定義
本節課,我們重點了解一下 ThinkPHP 模型操作部分。模型是 MVC 中的 M,可以理解為操作數據庫部分操作。
一.創建數據庫
在使用模型操作之前,我們首先創建一個數據庫:thinkphp。創建一個用戶表:user。
添加一些數據即可。
ThinkPHP 內置了抽象數據庫訪問層,把不同的數據庫操作封裝起來。我們只需要使用公共的 Db 類進行操作,無須針對不同的數據庫寫不同的代碼和底層實現。Db 類會自動調用相應的數據庫驅動來處理。
目前支持的數據庫包括 Mysql(包含 mysql 和 mysqli)、SqlServer、PgSQL、Sqlite、Oracle、Ibase、Mongo、PDO 等。
DB_TYPE 設置 | 支持的數據庫類型 |
mysql 或 mysqli | mysql |
pgsql | pgsql |
sqlite | sqlite |
mssql | sqlserver |
oracle | oracle |
ibase | ibase |
mongo | mongo |
PDO | PDO 支持的所有數據庫 |
//全局配置定義
‘DB_TYPE‘=>‘mysql‘, //數據庫類型
‘DB_HOST‘=>‘localhost‘, //服務器地址
‘DB_NAME‘=>‘thinkphp‘, //數據庫名
‘DB_USER‘=>‘root‘, //用戶名
‘DB_PWD‘=>‘123456‘, //密碼
‘DB_PORT‘=>3306, //端口
‘DB_PREFIX‘=>‘think_‘, //數據庫表前綴
PS:數據庫全局配置信息除了 PDO,均可以采用上面的設置。
//PDO專用定義
‘DB_TYPE‘=>‘pdo‘, //數據庫類型
‘DB_USER‘=>‘root‘, //用戶名
‘DB_PWD‘=>‘123456‘, //密碼
‘DB_PREFIX‘=>‘think_‘, //數據庫表前綴
‘DB_DSN‘=>‘mysql:host=localhost;dbname=thinkphp;charset=UTF8‘,
二.實例化模型
連接上數據庫後,我們需要從數據庫裏操作數據,那麽就需要實例化模型類。在 ThinkPHP 中,提供了 Model 基類處理,也可以使用 M()方法。
//實例化Model類,傳一個數據表名
$user = new Model(‘User‘);
//顯示變量結構
var_dump($user);
Model 基類可以傳遞三個參數:
Model([‘模型名‘],[‘數據表前綴‘],[‘數據庫連接信息‘]); //實例化Model類,改變表前綴
$user = new Model(‘User‘,‘tp_‘);
//實例化Model類,定義數據庫鏈接信息
$user =new Model(‘User‘,‘think_‘,‘mysql://root:123456@localhost/thinkphp‘);
//打印出所有數據
var_dump($user->select());
使用 Model 基類還需要導入命名空間,而使用 M()方法,則不需要。
//實例化Model類
$user = M(‘User‘);
除了使用 Model 基類和 M()方法,還有一種對應數據表的模型定義,比如:UserModel。
這種模型類並非必須定義的,只有當存在獨立的業務邏輯或者屬性的時候才需要。
//User模型類
namespace Home\Model;
use Think\Model;
class UserModel extends Model {}
創建了 UserModel 模型類後,控制器那頭就可以直接聲明。
//User模型類
$user = new UserModel();
var_dump($user->select());
為什麽 UserModel 模型類沒有指定任何表即可直接訪問呢?因為這種模型類基本是直接操作數據表的,所以在命名規範上和數據表名是對應的。
雖然使用模型類和數據表對應較為方便,但當有時我們需要更換表名、前綴、附加數據庫名等,就需要一些字段定義的操作。為了更加方便的了解數據表的變化,我們使用一下頁
面 Trace 工具,可以時時的查詢 SQL 的變化。//頁面Trace,調試輔助工具
‘SHOW_PAGE_TRACE‘ =>true,
//重新定義表前綴
class UserModel extends Model
{
protected $tablePrefix = ‘abc_‘;
}
//重新定義表名
class UserModel extends Model
{
protected $tableName = ‘abc‘;
}
//重新定義完整的帶前綴的表名
class UserModel extends Model
{
protected $trueTableName = ‘tp_abc‘;
}
//附加數據庫名
class UserModel extends Model
{
protected $dbName = ‘tp‘;
}
如果你僅僅使用 CURD 等數據庫基本操作,我們建議使用基於 Model 基類的 M()方法。
使用 M()方法由於不需要加載具體的模型類(比如 UserModel 類),所以性能會更高。
當然,如果有必要使用具體的模型類時,ThinkPHP 還提供了 D()方法來直接是實例化模型類,並且還可以免去引入命名空間等操作。
//實例化UserModel類
$user = D(‘User‘);
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 extends Model
{
protected $fields = array(‘id‘, ‘user‘, ‘_pk‘=>‘id‘);
}
//type 定義每個字段的類型,可以永遠字段驗證
class UserModel extends Model
{
protected $fields = array(‘id‘, ‘user‘, ‘_pk‘=>‘id‘, ‘type‘=>array(‘id‘=>‘smallint‘,‘user‘=>‘varchar‘));
}
ThinkPHP--模型初步