## 概述
模型類Think\Model配合數(shù)據(jù)庫(kù)中間層Think\Db實(shí)現(xiàn)了完整的ORM功能,包括CURD和ActiveRecord實(shí)現(xiàn)。
基礎(chǔ)模型類Model的設(shè)計(jì)非常靈活,無(wú)需進(jìn)行任何模型定義,就可以進(jìn)行相關(guān)數(shù)據(jù)表的ORM和CURD操作,只有在需要封裝單獨(dú)的業(yè)務(wù)邏輯的時(shí)候,模型類才是必須被定義的。
新版采用了PHP的Trait特性實(shí)現(xiàn)了模型的動(dòng)態(tài)組裝,可以更加靈活的實(shí)現(xiàn)模型的擴(kuò)展。
## 模型定義
如果你僅僅需要實(shí)現(xiàn)對(duì)數(shù)據(jù)表的CURD操作的話,實(shí)際上根本不需要定義模型類,直接實(shí)例化基礎(chǔ)模型類即可。(參考模型實(shí)例化)
只有當(dāng)你需要額外定義模型的屬性或者方法邏輯的時(shí)候,才需要額外定義模型類。模型類一般位于模塊的model 目錄下面,例如:
~~~
namespace app\index\model;
use think\Model;
class New extends Model{
public function getNews(){
//添加自己的業(yè)務(wù)邏輯
// ...
}
}
~~~
實(shí)例化代碼如下:
~~~
$model = \think\Loader::model('index/New');
// 快捷方法
$model = D('index/New');
~~~
如果你的模型沒(méi)有定義模型類的話,可以直接使用
~~~
$model = \think\Loader::table('New');
// 快捷方法
$model = M('New');
~~~
并且支持傳入模型參數(shù):
~~~
$config = [
'prefix' => 'think_',
'connection'=> $connection,
...
];
// 或者使用
$model = \think\Loader::table('New',$config);
~~~
支持的配置參數(shù)包括:
| 參數(shù)名|含義 |
|---|---|
| prefix | 數(shù)據(jù)表前綴 |
| connection | 數(shù)據(jù)庫(kù)連接信息 |
|table_name|實(shí)際的數(shù)據(jù)表(不含前綴)|
|true_table_name|實(shí)際的數(shù)據(jù)表(含前綴 支持指定數(shù)據(jù)庫(kù)名)|
|db_name|數(shù)據(jù)庫(kù)名稱|
支持多層的模型類定義,例如:
~~~
namespace app\index\model\one;
use think\Model;
class New extends Model{
public function getNews(){
//添加自己的業(yè)務(wù)邏輯
// ...
}
}
~~~
實(shí)例化代碼如下:
~~~
$model = \think\Loader::model('index/one/New');
// 快捷方法
$model = D('index/one/New');
~~~
注意如果類名是駝峰方式的話,例如:
~~~
namespace app\index\model;
use think\Model;
class UserType extends Model{
}
~~~
對(duì)應(yīng)的模型文件名應(yīng)該是:
~~~
application\index\model\UserType.php
~~~
默認(rèn)情況下,模型類和數(shù)據(jù)表的默認(rèn)對(duì)應(yīng)關(guān)系如下:
| 模型名(類名)|約定對(duì)應(yīng)數(shù)據(jù)表(假設(shè)數(shù)據(jù)庫(kù)的前綴定義是?think_) |
|---|---|
| User | think_user |
| UserType | think_user_type |
如果你的規(guī)則和上面的系統(tǒng)約定不符合,那么需要設(shè)置Model類的數(shù)據(jù)表名稱屬性。
在ThinkPHP的模型里面,有幾個(gè)關(guān)于數(shù)據(jù)表名稱的屬性定義:
| 屬性 | 說(shuō)明 |
|---|---|
| tableName | 不包含表前綴的數(shù)據(jù)表名稱,一般情況下默認(rèn)和模型名稱相同,只有當(dāng)你的表名和當(dāng)前的模型類的名稱不同的時(shí)候才需要定義。 |
| trueTableName | 包含前綴的數(shù)據(jù)表名稱,也就是數(shù)據(jù)庫(kù)中的實(shí)際表名,該名稱無(wú)需設(shè)置,只有當(dāng)上面的規(guī)則都不適用的情況或者特殊情況下才需要設(shè)置。 |
| dbName | 定義模型當(dāng)前對(duì)應(yīng)的數(shù)據(jù)庫(kù)名稱,只有當(dāng)你當(dāng)前的模型類對(duì)應(yīng)的數(shù)據(jù)庫(kù)名稱和配置文件不同的時(shí)候才需要定義。 |
下面舉個(gè)例子來(lái)加深理解,例如,在數(shù)據(jù)庫(kù)里面有一個(gè)think_categories表,而我們定義的模型類名稱是CategoryModel,按照系統(tǒng)的約定,這個(gè)模型的名稱是Category,對(duì)應(yīng)的數(shù)據(jù)表名稱應(yīng)該是think_category(全部小寫(xiě)),但是現(xiàn)在的數(shù)據(jù)表名稱是think_categories,因此我們就需要設(shè)置tableName屬性來(lái)改變默認(rèn)的規(guī)則(假設(shè)我們定義的數(shù)據(jù)表前綴`database.db_prefix` 為 think_)。
~~~
protected $tableName = 'categories';
~~~
注意這個(gè)屬性的定義不需要加表的前綴think_
而對(duì)于另外一種特殊情況,數(shù)據(jù)庫(kù)中有一個(gè)表(top_depts)的前綴和其它表前綴不同,不是think_ 而是 top_,這個(gè)時(shí)候我們就需要定義 trueTableName 屬性了
~~~
protected $trueTableName = 'top_depts';
~~~
注意trueTableName需要完整的表名定義
除了數(shù)據(jù)表的定義外,還可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行定義,例如:
~~~
protected $dbName = 'top';
~~~
## 查詢語(yǔ)言
ThinkPHP5.0的查詢語(yǔ)言基本和3.2版本保持一致,核心\Think\Model除了基本的CURD和AR查詢之外,還提供了一些統(tǒng)計(jì)函數(shù)、getField方法,及動(dòng)態(tài)查詢方法,使用如下:
~~~
$User = D('User');
$User->count();
$User->getField('name');
$User->getByName('thinkphp');
$User->getFieldByName('thinkphp','name');
~~~
> 查詢語(yǔ)言基本和3.2版本沒(méi)有任何變化,請(qǐng)先參考3.2的完全開(kāi)發(fā)手冊(cè)。
## 自動(dòng)驗(yàn)證和自動(dòng)完成
要使用模型的自動(dòng)驗(yàn)證和自動(dòng)完成功能,需要引入traits,例如:
~~~
namespace app\index\model;
T('model/Auto');
class User extends \think\Model{
use \traits\model\Auto;
// 下面是模型類的方法和屬性定義
}
~~~
如果你的PHP版本是5.5的話,可以省略下面這行代碼:
~~~
T('model/Auto');
~~~
## 視圖模型
視圖模型的用法也是需要首先繼承視圖模型擴(kuò)展,例如:
~~~
namespace app\index\model;
use think\model\View;
class UserType extends View{
}
~~~
其它用法和之前的視圖模型用法一致。
## 關(guān)聯(lián)模型
~~~
namespace app\index\model;
use think\model\Relation;
class User extends Relation{
}
~~~
- 介紹
- 快速入門(mén)
- 安裝配置
- 目錄結(jié)構(gòu)
- 系統(tǒng)架構(gòu)
- 命名規(guī)范
- 自動(dòng)生成
- 引導(dǎo)文件
- 自動(dòng)加載
- 配置
- 路由
- 控制器
- 模型
- 視圖
- 模板
- 自定義標(biāo)簽庫(kù)
- 數(shù)據(jù)庫(kù)
- 域名部署
- 輸入
- 緩存
- 日志
- 行為
- 多語(yǔ)言
- 調(diào)試
- 新特性介紹
- 增強(qiáng)路由功能
- 更靈活的控制器
- API開(kāi)發(fā)支持
- 內(nèi)置SocketLog
- 新的自動(dòng)生成
- 利用Traits特性擴(kuò)展
- 自動(dòng)加載及Loader類
- 命令行工具集
- 附錄
- 升級(jí)指南
- 配置參考
- 錯(cuò)誤編碼
