在ThinkPHP中,可以無需進行任何模型定義。只有在需要封裝單獨的業務邏輯的時候,模型類才是必須被定義的,因此ThinkPHP在模型上有很多的靈活和方便性,讓你無需因為表太多而煩惱。
根據不同的模型定義,我們有幾種實例化模型的方法,根據需要采用不同的方式:
## 直接實例化
可以和實例化其他類庫一樣實例化模型類,例如:
~~~
$User = new \Home\Model\UserModel();
$Info = new \Admin\Model\InfoModel();
// 帶參數實例化
$New = new \Home\Model\NewModel('blog','think_',$connection);
~~~
模型類通常都是繼承系統的\Think\Model類,該類的架構方法有三個參數,分別是:
##### Model(['模型名'],['數據表前綴'],['數據庫連接信息']);
三個參數都是可選的,大多數情況下,我們根本無需傳入任何參數即可實例化。
| 參數 | 描述 |
|-----|-----|
| 模型名 | 模型的名稱 和數據表前綴一起配合用于自動識別數據表名稱 |
| 數據表前綴 | 當前數據表前綴 和模型名一起配合用于自動識別數據表名稱 |
| 數據庫連接信息 | 當前數據表的數據庫連接信息 如果沒有則獲取配置文件中的 |
> 數據表前綴傳入空字符串表示取當前配置的表前綴,如果當前數據表沒有前綴,則傳入null即可。
數據庫連接信息參數支持三種格式:
##### 1、字符串定義
字符串定義采用DSN格式定義,格式定義規范為:
##### 數據庫類型://用戶名:密碼@數據庫主機名或者IP:數據庫端口/數據庫名#字符集
例如:
~~~
new \Home\Model\NewModel('blog','think_','mysql://root:1234@localhost/demo');
~~~
##### 2、數組定義
可以傳入數組格式的數據庫連接信息,例如:
~~~
$connection = array(
'db_type' => 'mysql',
'db_host' => '127.0.0.1',
'db_user' => 'root',
'db_pwd' => '12345',
'db_port' => 3306,
'db_name' => 'demo',
'db_charset' => 'utf8',
);
new \Home\Model\NewModel('new','think_',$connection);
~~~
如果需要的話,還可以傳入更多的連接參數,包括數據的部署模式和調試模式設定,例如:
~~~
$connection = array(
'db_type' => 'mysql',
'db_host' => '192.168.1.2,192.168.1.3',
'db_user' => 'root',
'db_pwd' => '12345',
'db_port' => 3306,
'db_name' => 'demo',
'db_charset' => 'utf8',
'db_deploy_type'=> 1,
'db_rw_separate'=> true,
'db_debug' => true,
);
// 分布式數據庫部署 并且采用讀寫分離 開啟數據庫調試模式
new \Home\Model\NewModel('new','think_',$connection);
~~~
> 注意,如果設置了db_debug參數,那么數據庫調試模式就不再受APP_DEBUG常量影響。
##### 3、配置定義
我們可以事先在配置文件中定義好數據庫連接信息,然后在實例化的時候直接傳入配置的名稱即可,例如:
~~~
//數據庫配置1
'DB_CONFIG1' => array(
'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => '1234',
'db_host' => 'localhost',
'db_port' => '3306',
'db_name' => 'thinkphp'
),
//數據庫配置2
'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp',
~~~
在配置文件中定義數據庫連接信息的時候也支持字符串和數組格式,格式和上面實例化傳入的參數一樣。
然后,我們就可以這樣實例化模型類傳入連接信息:
~~~
new \Home\Model\NewModel('new','think_','DB_CONFIG1');
new \Home\Model\BlogModel('blog','think_','DB_CONFIG2');
~~~
事實上,當我們實例化的時候沒有傳入任何的數據庫連接信息的時候,系統其實默認會獲取配置文件中的相關配置參數,包括:
~~~
'DB_TYPE' => '', // 數據庫類型
'DB_HOST' => '', // 服務器地址
'DB_NAME' => '', // 數據庫名
'DB_USER' => '', // 用戶名
'DB_PWD' => '', // 密碼
'DB_PORT' => '', // 端口
'DB_PREFIX' => '', // 數據庫表前綴
'DB_DSN' => '', // 數據庫連接DSN 用于PDO方式
'DB_CHARSET' => 'utf8', // 數據庫的編碼 默認為utf8
~~~
如果應用配置文件中有配置上述數據庫連接信息的話,實例化模型將會變得非常簡單。
## D方法實例化
上面實例化的時候我們需要傳入完整的類名,系統提供了一個快捷方法D用于數據模型的實例化操作。
要實例化自定義模型類,可以使用下面的方式:
~~~
<?php
//實例化模型
$User = D('User');
// 相當于 $User = new \Home\Model\UserModel();
// 執行具體的數據操作
$User->select();
~~~
> 當 `\Home\Model\UserModel` 類不存在的時候,D函數會嘗試實例化公共模塊下面的 `\Common\Model\UserModel` 類。
D方法的參數就是模型的名稱,并且和模型類的大小寫定義是一致的,例如:
| 參數 | 實例化的模型文件(假設當前模塊為Home) |
|-----|-----|
| User | 對應的模型類文件的 \Home\Model\UserModel.class.php |
| UserType | 對應的模型類文件的 \Home\Model\UserTypeModel.class.php |
> 如果在Linux環境下面,一定要注意D方法實例化的時候的模型名稱的大小寫。
D方法可以自動檢測模型類,如果存在自定義的模型類,則實例化自定義模型類,如果不存在,則會實例化系統的\Think\Model基類,同時對于已實例化過的模型,不會重復實例化。
~~~
D方法還可以支持跨模塊調用,需要使用:
//實例化Admin模塊的User模型
D('Admin/User');
//實例化Extend擴展命名空間下的Info模型
D('Extend://Editor/Info');
~~~
> 注意:跨模塊實例化模型類的時候 不支持自動加載公共模塊的模型類。
## M方法實例化模型
D方法實例化模型類的時候通常是實例化某個具體的模型類,如果你僅僅是對數據表進行基本的CURD操作的話,使用M方法實例化的話,由于不需要加載具體的模型類,所以性能會更高。
例如:
~~~
// 使用M方法實例化
$User = M('User');
// 和用法 $User = new \Think\Model('User'); 等效
// 執行其他的數據操作
$User->select();
~~~
M方法也可以支持跨庫操作,例如:
~~~
// 使用M方法實例化 操作db_name數據庫的ot_user表
$User = M('db_name.User','ot_');
// 執行其他的數據操作
$User->select();
~~~
M方法的參數和\Think\Model類的參數是一樣的,也就是說,我們也可以這樣實例化:
~~~
$New = M('new','think_',$connection);
// 等效于 $New = new \Think\Model('new','think_',$connection);
~~~
具體的參數含義可以參考前面的介紹。
M方法實例化的時候,默認情況下是直接實例化系統的\Think\Model類,如果我們希望實例化其他的公共模型類的話,可以使用如下方法:
~~~
$User = M('\Home\Model\CommonModel:User','think_','db_config');
// 相當于 $User = new \Home\Model\CommonModel('User','think_','db_config');
~~~
> 如果你的模型類有自己的業務邏輯,M方法是無法支持的,就算是你已經定義了具體的模型類,M方法實例化的時候是會直接忽略。
## 實例化空模型類
如果你僅僅是使用原生SQL查詢的話,不需要使用額外的模型類,實例化一個空模型類即可進行操作了,例如:
~~~
//實例化空模型
$Model = new Model();
//或者使用M快捷方法是等效的
$Model = M();
//進行原生的SQL查詢
$Model->query('SELECT * FROM think_user WHERE status = 1');
~~~
> 實例化空模型類后還可以用table方法切換到具體的數據表進行操作
我們在實例化的過程中,經常使用D方法和M方法,這兩個方法的區別在于M方法實例化模型無需用戶為每個數據表定義模型類,如果D方法沒有找到定義的模型類,則會自動調用M方法。
- 序言
- 基礎
- 獲取ThinkPHP
- 環境要求
- 目錄結構
- 入口文件
- 自動生成
- 模塊
- 控制器
- 開發規范
- 配置
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 擴展配置
- 批量配置
- 架構
- 模塊化設計
- URL模式
- 多層MVC
- CBD模式
- 命名空間
- 自動加載
- 應用模式
- 項目編譯
- 系統流程
- 路由
- 路由定義
- 規則路由
- 正則路由
- 靜態路由
- 閉包支持
- 實例說明
- 控制器
- 控制器定義
- 前置和后置操作
- Action參數綁定
- 偽靜態
- URL大小寫
- URL生成
- AJAX返回
- 跳轉和重定向
- 輸入變量
- 請求類型
- 空操作
- 空控制器
- 插件控制器
- 操作綁定到類
- 模型
- 模型定義
- 模型實例化
- 字段定義
- 連接數據庫
- 切換數據庫
- 分布式數據庫支持
- 連貫操作
- WHERE
- TABLE
- ALIAS
- DATA
- FIELD
- ORDER
- LIMIT
- PAGE
- GROUP
- HAVING
- JOIN
- UNION
- DISTINCT
- LOCK
- CACHE
- COMMENT
- RELATION
- USING
- fetchSql
- TOKEN
- STRICT
- INDEX
- 命名范圍
- CURD操作
- 數據創建
- 數據寫入
- 數據讀取
- 數據更新
- 數據刪除
- ActiveRecord
- 字段映射
- 查詢語言
- 查詢方式
- 表達式查詢
- 快捷查詢
- 區間查詢
- 組合查詢
- 統計查詢
- SQL查詢
- 動態查詢
- 子查詢
- 自動驗證
- 自動完成
- 參數綁定
- 虛擬模型
- 模型分層
- 視圖模型
- 關聯模型
- 高級模型
- Mongo模型
- 視圖
- 模板定義
- 模板主題
- 模板賦值
- 模板渲染
- 獲取模板地址
- 獲取內容
- 模板引擎
- 模板
- 變量輸出
- 系統變量
- 使用函數
- 默認值輸出
- 使用運算符
- 標簽庫
- 模板繼承
- 修改定界符
- 三元運算
- 包含文件
- 內置標簽
- Volist標簽
- Foreach標簽
- For標簽
- Switch標簽
- 比較標簽
- 范圍判斷標簽
- IF標簽
- Present標簽
- Empty標簽
- Defined標簽
- Assign標簽
- Define標簽
- 標簽嵌套
- import標簽
- 使用PHP代碼
- 原樣輸出
- 模板注釋
- 模板布局
- 模板替換
- 調試
- 調試模式
- 異常處理
- 日志記錄
- 頁面Trace
- Trace方法
- 變量調試
- 性能調試
- 錯誤調試
- 模型調試
- 緩存
- 數據緩存
- 快速緩存
- 查詢緩存
- 靜態緩存
- 安全
- 輸入過濾
- 表單合法性檢測
- 表單令牌
- 防止SQL注入
- 目錄安全文件
- 保護模板文件
- 上傳安全
- 防止XSS攻擊
- 其他安全建議
- 擴展
- 類庫擴展
- 驅動擴展
- 緩存驅動
- 數據庫驅動
- 日志驅動
- Session驅動
- 存儲驅動
- 模板引擎驅動
- 標簽庫驅動
- 行為擴展
- 標簽擴展
- Widget擴展
- 應用模式
- 部署
- PATH_INFO支持
- URL重寫
- 模塊部署
- 域名部署
- 入口綁定
- 替換入口
- 專題
- SESSION支持
- Cookie支持
- 多語言支持
- 數據分頁
- 文件上傳
- 驗證碼
- 圖像處理
- RESTFul
- RPC
- SAE
- IP獲取和定位
- 附錄
- 常量參考
- 配置參考
- 升級指導
- 鳴謝