1. 程式人生 > >ThinkPHP--模型初步

ThinkPHP--模型初步

基本 生成 邏輯 space 方式 HERE 方法 cell base

  學習要點:

  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--模型初步